RightSettings.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. <script setup lang="ts">
  2. import { useGettext } from 'vue3-gettext'
  3. import { Modal, message } from 'ant-design-vue'
  4. import type { Ref } from 'vue'
  5. import type { Stream } from '@/api/stream'
  6. import stream from '@/api/stream'
  7. import ChatGPT from '@/components/ChatGPT/ChatGPT.vue'
  8. import { formatDateTime } from '@/lib/helper'
  9. import Deploy from '@/views/stream/components/Deploy.vue'
  10. import { useSettingsStore } from '@/pinia'
  11. import type { ChatComplicationMessage } from '@/api/openai'
  12. import type { NgxConfig } from '@/api/ngx'
  13. const settings = useSettingsStore()
  14. const { $gettext } = useGettext()
  15. const configText = inject('configText') as Ref<string>
  16. const ngx_config = inject('ngx_config') as Ref<NgxConfig>
  17. const enabled = inject('enabled') as Ref<boolean>
  18. const name = inject('name') as Ref<string>
  19. const history_chatgpt_record = inject('history_chatgpt_record') as Ref<ChatComplicationMessage[]>
  20. const filename = inject('filename')
  21. const data = inject('data') as Ref<Stream>
  22. const [modal, ContextHolder] = Modal.useModal()
  23. const active_key = ref(['1', '2', '3'])
  24. function enable() {
  25. stream.enable(name.value).then(() => {
  26. message.success($gettext('Enabled successfully'))
  27. enabled.value = true
  28. }).catch(r => {
  29. message.error($gettext('Failed to enable %{msg}', { msg: r.message ?? '' }), 10)
  30. })
  31. }
  32. function disable() {
  33. stream.disable(name.value).then(() => {
  34. message.success($gettext('Disabled successfully'))
  35. enabled.value = false
  36. }).catch(r => {
  37. message.error($gettext('Failed to disable %{msg}', { msg: r.message ?? '' }))
  38. })
  39. }
  40. function on_change_enabled(checked: boolean) {
  41. modal.confirm({
  42. title: checked ? $gettext('Do you want to enable this stream?') : $gettext('Do you want to disable this stream?'),
  43. mask: false,
  44. centered: true,
  45. okText: $gettext('OK'),
  46. cancelText: $gettext('Cancel'),
  47. async onOk() {
  48. if (checked)
  49. enable()
  50. else
  51. disable()
  52. },
  53. })
  54. }
  55. </script>
  56. <template>
  57. <ACard
  58. class="right-settings"
  59. :bordered="false"
  60. >
  61. <ContextHolder />
  62. <ACollapse
  63. v-model:activeKey="active_key"
  64. ghost
  65. >
  66. <ACollapsePanel
  67. key="1"
  68. :header="$gettext('Basic')"
  69. >
  70. <AFormItem :label="$gettext('Enabled')">
  71. <ASwitch
  72. :checked="enabled"
  73. @change="on_change_enabled"
  74. />
  75. </AFormItem>
  76. <AFormItem :label="$gettext('Name')">
  77. <AInput v-model:value="filename" />
  78. </AFormItem>
  79. <AFormItem :label="$gettext('Updated at')">
  80. {{ formatDateTime(data.modified_at) }}
  81. </AFormItem>
  82. </ACollapsePanel>
  83. <ACollapsePanel
  84. v-if="!settings.is_remote"
  85. key="2"
  86. :header="$gettext('Deploy')"
  87. >
  88. <Deploy />
  89. </ACollapsePanel>
  90. <ACollapsePanel
  91. key="3"
  92. header="ChatGPT"
  93. >
  94. <ChatGPT
  95. v-model:history-messages="history_chatgpt_record"
  96. :content="configText"
  97. :path="ngx_config.file_name"
  98. />
  99. </ACollapsePanel>
  100. </ACollapse>
  101. </ACard>
  102. </template>
  103. <style scoped lang="less">
  104. .right-settings {
  105. position: sticky;
  106. top: 78px;
  107. :deep(.ant-card-body) {
  108. max-height: 100vh;
  109. overflow-y: scroll;
  110. }
  111. }
  112. :deep(.ant-collapse-ghost > .ant-collapse-item > .ant-collapse-content > .ant-collapse-content-box) {
  113. padding: 0;
  114. }
  115. :deep(.ant-collapse > .ant-collapse-item > .ant-collapse-header) {
  116. padding: 0 0 10px 0;
  117. }
  118. </style>