setting-state.ts 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import { reactive, watch } from 'vue'
  2. import storejs from 'store'
  3. import { IMusicScore } from '/osmd-extended/src'
  4. import qs from 'query-string'
  5. export interface SettingState {
  6. sett: iSett
  7. eva: iEva
  8. }
  9. /* 基本设置 */
  10. export type iSett = {
  11. /** 护眼模式 */
  12. eyeProtection: boolean
  13. /** 延迟检测 */
  14. tuning: boolean
  15. /** 摄像头 */
  16. camera: boolean
  17. /** 摄像头 透明度 */
  18. opacity: number
  19. /** 循环播放 */
  20. loop: boolean
  21. /** 显示指法 */
  22. fingering: boolean
  23. /** 播放频率 */
  24. hertz: number
  25. /**曲谱大小 */
  26. scoreSize: 'small' | 'middle' | 'large'
  27. /** 曲谱类型 */
  28. type: IMusicScore
  29. /** 是否固定调 */
  30. keySignature: boolean
  31. /** 自定义每行小节数开关 */
  32. openCustomNodule: boolean
  33. /** 自定义每行小节数开关 */
  34. customNoduleNum: number
  35. }
  36. export type IDifficulty = 'BEGINNER' | 'ADVANCED' | 'PERFORMER'
  37. /* 评测设置 */
  38. export type iEva = {
  39. /** 难度 */
  40. difficulty: IDifficulty
  41. /** 是否保存到相册 */
  42. save: boolean
  43. /** 开启伴奏*/
  44. mute: boolean
  45. /** 反应时间MS */
  46. reactionTimeMs: number
  47. }
  48. const search = qs.parse(location.search);
  49. const saveSetting = storejs.get('setting')
  50. let initState: SettingState = {
  51. sett: {
  52. eyeProtection: false,
  53. tuning: false,
  54. camera: false,
  55. opacity: 70,
  56. loop: true,
  57. fingering: true,
  58. hertz: 442,
  59. scoreSize: 'middle',
  60. type: 'staff',
  61. keySignature: false,
  62. openCustomNodule: true,
  63. customNoduleNum: 4,
  64. },
  65. eva: {
  66. difficulty: 'ADVANCED',
  67. save: false,
  68. mute: true,
  69. reactionTimeMs: 0
  70. },
  71. }
  72. if (saveSetting) {
  73. const customNoduleInfo = JSON.parse(localStorage.getItem('customNoduleInfo')) || []
  74. const matchMusic = customNoduleInfo.find((n: any) => n.id === search?.id)
  75. const defaultNum = matchMusic ? matchMusic.customNum : 4
  76. // 如果有保存的设置,则使用保存的设置
  77. // 酷乐秀强制440,评测时会重新按照此处配置计算频率
  78. initState.eva = { ...initState.eva, ...saveSetting.eva }
  79. initState.sett = { ...initState.sett, ...saveSetting.sett, ...{customNoduleNum: defaultNum} };
  80. (window as any).sett = initState.sett
  81. }
  82. const state: SettingState = reactive(initState)
  83. watch(state, () => {
  84. storejs.set('setting', state)
  85. })
  86. export default state