ReaderDialogs.vue 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. <template>
  2. <div>
  3. <Dialog ref="dialog1" v-model="whatsNewVisible">
  4. <template slot="header">
  5. Что нового:
  6. </template>
  7. <div style="line-height: 20px" v-html="whatsNewContent"></div>
  8. <span class="clickable" @click="openVersionHistory">Посмотреть историю версий</span>
  9. <span slot="footer">
  10. <q-btn class="q-px-md" dense no-caps @click="whatsNewDisable">Больше не показывать</q-btn>
  11. </span>
  12. </Dialog>
  13. <Dialog ref="dialog2" v-model="donationVisible">
  14. <template slot="header">
  15. Здравствуйте, уважаемые читатели!
  16. </template>
  17. <div style="word-break: normal">
  18. Стартовала ежегодная акция "Оплатим хостинг вместе".<br><br>
  19. Для оплаты годового хостинга читалки, необходимо собрать около 2000 рублей.
  20. В настоящий момент у автора эта сумма есть в наличии. Однако будет справедливо, если каждый
  21. сможет проголосовать рублем за то, чтобы читалка так и оставалась:
  22. <ul>
  23. <li>непрерывно улучшаемой</li>
  24. <li>без рекламы</li>
  25. <li>без регистрации</li>
  26. <li>Open Source</li>
  27. </ul>
  28. Автор также обращается с просьбой о помощи в распространении
  29. <a href="https://omnireader.ru" target="_blank">ссылки</a>
  30. <q-icon class="copy-icon" name="la la-copy" @click="copyLink('https://omnireader.ru')">
  31. <q-tooltip :delay="1000" anchor="top middle" self="center middle" content-style="font-size: 80%">Скопировать</q-tooltip>
  32. </q-icon>
  33. на читалку через тематические форумы, соцсети, мессенджеры и пр.
  34. Чем нас больше, тем легче оставаться на плаву и тем больше мотивации у разработчика, чтобы продолжать работать над проектом.
  35. <br><br>
  36. Если соберется бóльшая сумма, то разработка децентрализованной библиотеки для свободного обмена книгами будет по возможности ускорена.
  37. <br><br>
  38. P.S. При необходимости можно воспользоваться подходящим обменником на <a href="https://www.bestchange.ru" target="_blank">bestchange.ru</a>
  39. <br><br>
  40. <div class="row justify-center">
  41. <q-btn class="q-px-sm" color="primary" dense no-caps rounded @click="openDonate">Помочь проекту</q-btn>
  42. </div>
  43. </div>
  44. <span slot="footer">
  45. <span class="clickable row justify-end" style="font-size: 60%; color: grey" @click="donationDialogDisable">Больше не показывать</span>
  46. <br>
  47. <q-btn class="q-px-sm" dense no-caps @click="donationDialogRemind">Напомнить позже</q-btn>
  48. </span>
  49. </Dialog>
  50. <Dialog ref="dialog3" v-model="liberamaTopVisible">
  51. <template slot="header">
  52. Здравствуйте, уважаемые читатели!
  53. </template>
  54. <div style="word-break: normal">
  55. Создан новый ресурс:<br><br>
  56. <a href="https://liberama.top" target="_blank">https://liberama.top</a>
  57. <br><br>
  58. Это клон читалки Omni Reader, но с некоторыми дополнениями, ориентированными в сторону более свободного обмена книгами:
  59. <ul>
  60. <li>добавлено новое окно "Библиотека" для свободного доступа к Флибусте и другим ресурсам по желанию читателя</li>
  61. <li>планируется добавить возможность создания подборок книг и обмена ими между пользователями</li>
  62. </ul>
  63. Легко мигрировать на новый сайт можно с помощью синхронизации с сервером.
  64. О багах и предложениях просьба сообщать на почту <a href="mailto:bookpauk@gmail.com">bookpauk@gmail.com</a><br><br>
  65. Спасибо, что вы с нами!
  66. <br><br>
  67. <div class="row justify-center">
  68. <q-btn class="q-px-sm" color="primary" dense no-caps rounded @click="openDonate">Помочь проекту</q-btn>
  69. </div>
  70. </div>
  71. <span slot="footer">
  72. <q-btn class="q-px-sm" dense no-caps @click="liberamaTopDialogDisable">Больше не показывать</q-btn>
  73. </span>
  74. </Dialog>
  75. </div>
  76. </template>
  77. <script>
  78. //-----------------------------------------------------------------------------
  79. import Vue from 'vue';
  80. import Component from 'vue-class-component';
  81. import Dialog from '../../share/Dialog.vue';
  82. import * as utils from '../../../share/utils';
  83. import {versionHistory} from '../versionHistory';
  84. export default @Component({
  85. components: {
  86. Dialog
  87. },
  88. watch: {
  89. settings: function() {
  90. this.loadSettings();
  91. },
  92. },
  93. })
  94. class ReaderDialogs extends Vue {
  95. whatsNewVisible = false;
  96. whatsNewContent = '';
  97. donationVisible = false;
  98. liberamaTopVisible = false;
  99. created() {
  100. this.commit = this.$store.commit;
  101. this.loadSettings();
  102. }
  103. mounted() {
  104. }
  105. async init() {
  106. await this.showWhatsNew();
  107. await this.showDonation();
  108. await this.showLiberamaTop();
  109. }
  110. loadSettings() {
  111. const settings = this.settings;
  112. this.showWhatsNewDialog = settings.showWhatsNewDialog;
  113. this.showDonationDialog2020 = settings.showDonationDialog2020;
  114. this.showLiberamaTopDialog2020 = settings.showLiberamaTopDialog2020;
  115. }
  116. async showWhatsNew() {
  117. const whatsNew = versionHistory[0];
  118. if (this.showWhatsNewDialog &&
  119. whatsNew.showUntil >= utils.formatDate(new Date(), 'coDate') &&
  120. whatsNew.header != this.whatsNewContentHash) {
  121. await utils.sleep(2000);
  122. this.whatsNewContent = 'Версия ' + whatsNew.header + whatsNew.content;
  123. this.whatsNewVisible = true;
  124. }
  125. }
  126. async showDonation() {
  127. const today = utils.formatDate(new Date(), 'coDate');
  128. if ((this.mode == 'omnireader' || this.mode == 'liberama.top') && today < '2020-03-01' && this.showDonationDialog2020 && this.donationRemindDate != today) {
  129. await utils.sleep(3000);
  130. this.donationVisible = true;
  131. }
  132. }
  133. donationDialogDisable() {
  134. this.donationVisible = false;
  135. if (this.showDonationDialog2020) {
  136. this.commit('reader/setSettings', { showDonationDialog2020: false });
  137. }
  138. }
  139. donationDialogRemind() {
  140. this.donationVisible = false;
  141. this.commit('reader/setDonationRemindDate', utils.formatDate(new Date(), 'coDate'));
  142. }
  143. openDonate() {
  144. this.donationVisible = false;
  145. this.liberamaTopVisible = false;
  146. this.$emit('donate-toggle');
  147. }
  148. async copyLink(link) {
  149. const result = await utils.copyTextToClipboard(link);
  150. if (result)
  151. this.$root.notify.success(`Ссылка ${link} успешно скопирована в буфер обмена`);
  152. else
  153. this.$root.notify.error('Копирование не удалось');
  154. }
  155. openVersionHistory() {
  156. this.whatsNewVisible = false;
  157. this.$emit('version-history-toggle');
  158. }
  159. whatsNewDisable() {
  160. this.whatsNewVisible = false;
  161. const whatsNew = versionHistory[0];
  162. this.commit('reader/setWhatsNewContentHash', whatsNew.header);
  163. }
  164. get mode() {
  165. return this.$store.state.config.mode;
  166. }
  167. get settings() {
  168. return this.$store.state.reader.settings;
  169. }
  170. get whatsNewContentHash() {
  171. return this.$store.state.reader.whatsNewContentHash;
  172. }
  173. get donationRemindDate() {
  174. return this.$store.state.reader.donationRemindDate;
  175. }
  176. async showLiberamaTop() {
  177. const today = utils.formatDate(new Date(), 'coDate');
  178. if (this.mode == 'omnireader' && today < '2020-12-01' && this.showLiberamaTopDialog2020) {
  179. await utils.sleep(3000);
  180. this.liberamaTopVisible = true;
  181. }
  182. }
  183. liberamaTopDialogDisable() {
  184. this.liberamaTopVisible = false;
  185. if (this.showLiberamaTopDialog2020) {
  186. this.commit('reader/setSettings', { showLiberamaTopDialog2020: false });
  187. }
  188. }
  189. keyHook() {
  190. if (this.$refs.dialog1.active || this.$refs.dialog2.active || this.$refs.dialog3.active)
  191. return true;
  192. return false;
  193. }
  194. }
  195. //-----------------------------------------------------------------------------
  196. </script>
  197. <style scoped>
  198. .clickable {
  199. color: blue;
  200. text-decoration: underline;
  201. cursor: pointer;
  202. }
  203. .copy-icon {
  204. cursor: pointer;
  205. font-size: 120%;
  206. color: blue;
  207. }
  208. </style>