settings.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. const settingsService = require('../../store/settings-store.js')
  2. const themeService = require('../../store/theme-store.js')
  3. const transport = require('../../transport/ble-core.js')
  4. const {
  5. createPageToast
  6. } = require('../../utils/page-toast.js')
  7. const {
  8. createToolInitialState,
  9. toolNavigation,
  10. toolPageHandlers
  11. } = require('../../features/tools/index.js')
  12. const {
  13. getSettingsPageState
  14. } = require('../../features/settings/view-model.js')
  15. const protocolImplementation = require('../../features/settings/protocol-implementation.js')
  16. const {
  17. getWxApi
  18. } = require('../../utils/base-utils.js')
  19. function mergeDraftFields(data = {}, nextState = {}, draftFields = {}) {
  20. const draftValues = {}
  21. Object.keys(draftFields).forEach((field) => {
  22. if (draftFields[field]) {
  23. draftValues[field] = data[field]
  24. }
  25. })
  26. return {
  27. ...nextState,
  28. ...draftValues
  29. }
  30. }
  31. Page({
  32. data: {
  33. ...getSettingsPageState(),
  34. ...protocolImplementation.getState(),
  35. ...createToolInitialState(),
  36. activeSettingsTitle: '',
  37. activeSettingsView: ''
  38. },
  39. onLoad() {
  40. this.pageToast = createPageToast(this, this.data)
  41. this.crcFileBytes = null
  42. this.settingsDraftFields = {}
  43. settingsService.init()
  44. themeService.init()
  45. this.unsubscribeSettings = settingsService.subscribe((settingsState) => {
  46. this.setData(this.mergeSettingsDrafts(getSettingsPageState(settingsState, themeService.getState())))
  47. })
  48. this.unsubscribeTheme = themeService.subscribe((themeState) => {
  49. this.setData(this.mergeSettingsDrafts(getSettingsPageState(settingsService.getState(), themeState)))
  50. })
  51. this.unsubscribeTransport = transport.subscribe((transportState) => {
  52. this.setData(this.mergeSettingsDrafts(getSettingsPageState(
  53. settingsService.getState(),
  54. themeService.getState(),
  55. transportState
  56. )))
  57. })
  58. },
  59. onTabItemTap() {
  60. this.backToSettingsHome()
  61. },
  62. onShow() {
  63. if (this.pageToast) {
  64. this.pageToast.setActive(true)
  65. }
  66. this.setData(this.mergeSettingsDrafts(getSettingsPageState()))
  67. },
  68. onHide() {
  69. if (this.pageToast) {
  70. this.pageToast.setActive(false)
  71. }
  72. },
  73. onUnload() {
  74. if (this.pageToast) {
  75. this.pageToast.destroy()
  76. this.pageToast = null
  77. }
  78. if (this.unsubscribeSettings) {
  79. this.unsubscribeSettings()
  80. this.unsubscribeSettings = null
  81. }
  82. if (this.unsubscribeTheme) {
  83. this.unsubscribeTheme()
  84. this.unsubscribeTheme = null
  85. }
  86. if (this.unsubscribeTransport) {
  87. this.unsubscribeTransport()
  88. this.unsubscribeTransport = null
  89. }
  90. },
  91. onNightModeEnabledChange(event) {
  92. settingsService.setNightModeEnabled(!!event.detail.value)
  93. },
  94. onNightModeFollowSystemChange(event) {
  95. settingsService.setNightModeFollowSystem(!!event.detail.value)
  96. },
  97. onParameterCardControlChange(event) {
  98. settingsService.setParameterCardControlEnabled(!!event.detail.value)
  99. },
  100. onSettingsDraftInput(event) {
  101. const field = event && event.currentTarget && event.currentTarget.dataset
  102. ? event.currentTarget.dataset.field
  103. : ''
  104. if (!field) return
  105. if (!this.settingsDraftFields) this.settingsDraftFields = {}
  106. this.settingsDraftFields[field] = true
  107. this.setData({
  108. [field]: event.detail.value
  109. })
  110. },
  111. mergeSettingsDrafts(nextState) {
  112. return mergeDraftFields(this.data, nextState, this.settingsDraftFields)
  113. },
  114. clearSettingsDraft(field) {
  115. if (this.settingsDraftFields && field) {
  116. delete this.settingsDraftFields[field]
  117. }
  118. },
  119. onModbusSlaveAddressBlur(event) {
  120. this.clearSettingsDraft('modbusSlaveAddress')
  121. settingsService.setModbusSlaveAddress(event.detail.value)
  122. },
  123. onProtocolModeChange(event) {
  124. const option = this.data.protocolOptions[Number(event.detail.value)]
  125. if (!option) return
  126. settingsService.setProtocolMode(option.key)
  127. },
  128. onParameterAutoPollChange(event) {
  129. settingsService.setParameterAutoPollEnabled(!!event.detail.value)
  130. },
  131. onStorageAccessDefaultEndianChange(event) {
  132. settingsService.setStorageAccessDefaultEndian(event.detail.value ? 'big' : 'little')
  133. },
  134. onParameterPollIntervalBlur(event) {
  135. this.clearSettingsDraft('parameterPollInterval')
  136. settingsService.setParameterPollInterval(event.detail.value)
  137. },
  138. onParameterMaxPacketLengthBlur(event) {
  139. this.clearSettingsDraft('parameterMaxPacketLength')
  140. settingsService.setParameterMaxPacketLength(event.detail.value)
  141. },
  142. openToolEntry(event) {
  143. const view = event.currentTarget.dataset.view
  144. if (!toolNavigation.isToolView(view)) return
  145. if (this.pageToast) this.pageToast.clear()
  146. this.setData({
  147. activeSettingsTitle: toolNavigation.getToolTitle(view),
  148. activeSettingsView: view
  149. })
  150. },
  151. openProtocolImplementation() {
  152. if (this.pageToast) this.pageToast.clear()
  153. this.setData({
  154. activeSettingsTitle: protocolImplementation.TITLE,
  155. activeSettingsView: protocolImplementation.VIEW_ID,
  156. ...protocolImplementation.getState(this.data.storageProtocolImplementationActiveIndex)
  157. })
  158. },
  159. selectProtocolImplementationFile(event) {
  160. const index = Number(event.currentTarget.dataset.index)
  161. this.setData(protocolImplementation.getState(index))
  162. },
  163. copyProtocolImplementationFile(event) {
  164. const index = event && event.currentTarget && event.currentTarget.dataset
  165. ? Number(event.currentTarget.dataset.index)
  166. : this.data.storageProtocolImplementationActiveIndex
  167. const text = protocolImplementation.getSourceText(index)
  168. if (!text) {
  169. if (this.pageToast) this.pageToast.show('源码暂未提供')
  170. return
  171. }
  172. const wxApi = getWxApi()
  173. if (typeof wxApi.setClipboardData !== 'function') {
  174. if (this.pageToast) this.pageToast.show('当前环境不支持复制', 'error')
  175. return
  176. }
  177. wxApi.setClipboardData({
  178. data: text,
  179. fail: () => {
  180. if (this.pageToast) this.pageToast.show('复制失败', 'error')
  181. },
  182. success: () => {
  183. const file = protocolImplementation.getState(index).storageProtocolImplementationActiveFile
  184. if (this.pageToast) this.pageToast.show(`已复制 ${file.name}`)
  185. }
  186. })
  187. },
  188. backToSettingsHome() {
  189. if (this.pageToast) this.pageToast.clear()
  190. this.setData({
  191. activeSettingsTitle: '',
  192. activeSettingsView: ''
  193. })
  194. },
  195. ...toolPageHandlers
  196. })