1
0

Settings.vue 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. <template>
  2. <div class="discover-admin-settings-component">
  3. <div v-if="isLoaded" class="container-fluid mt-3">
  4. <div class="row">
  5. <div class="col-md-4 col-lg-3">
  6. <sidebar :user="profile" />
  7. </div>
  8. <div class="col-md-6 col-lg-6">
  9. <b-breadcrumb class="font-default" :items="breadcrumbItems"></b-breadcrumb>
  10. <h1 class="font-default">Discover Settings</h1>
  11. <!-- <p class="font-default lead">Browse timelines of a specific instance</p> -->
  12. <hr>
  13. <div class="card font-default shadow-none border">
  14. <div class="card-header">
  15. <p class="text-center font-weight-bold mb-0">Manage Features</p>
  16. </div>
  17. <div class="card-body">
  18. <div class="mb-2">
  19. <b-form-checkbox size="lg" v-model="hashtags.enabled" name="check-button" switch class="font-weight-bold">
  20. My Hashtags
  21. </b-form-checkbox>
  22. <p class="text-muted">Allow users to browse timelines of hashtags they follow</p>
  23. </div>
  24. <div class="mb-2">
  25. <b-form-checkbox size="lg" v-model="memories.enabled" name="check-button" switch class="font-weight-bold">
  26. My Memories
  27. </b-form-checkbox>
  28. <p class="text-muted">Allow users to access Memories, a timeline of posts they made or liked on this day in past years</p>
  29. </div>
  30. <div class="mb-2">
  31. <b-form-checkbox size="lg" v-model="insights.enabled" name="check-button" switch class="font-weight-bold">
  32. Account Insights
  33. </b-form-checkbox>
  34. <p class="text-muted">Allow users to access Account Insights, an overview of their account activity</p>
  35. </div>
  36. <div class="mb-2">
  37. <b-form-checkbox size="lg" v-model="friends.enabled" name="check-button" switch class="font-weight-bold">
  38. Find Friends
  39. </b-form-checkbox>
  40. <p class="text-muted">Allow users to access Find Friends, a directory of popular accounts</p>
  41. </div>
  42. <div>
  43. <b-form-checkbox size="lg" v-model="server.enabled" name="check-button" switch class="font-weight-bold">
  44. Server Timelines
  45. </b-form-checkbox>
  46. <p class="text-muted">Allow users to access Server Timelines, a timeline of public posts from a specific instance</p>
  47. </div>
  48. </div>
  49. </div>
  50. <div v-if="server.enabled" class="card font-default shadow-none border my-3">
  51. <div class="card-header">
  52. <p class="text-center font-weight-bold mb-0">Manage Server Timelines</p>
  53. </div>
  54. <div class="card-body">
  55. <div class="mb-2">
  56. <b-form-group label="Server Mode">
  57. <b-form-radio v-model="server.mode" value="all" disabled>Allow any instance (Not Recommended)</b-form-radio>
  58. <b-form-radio v-model="server.mode" value="allowlist">Limit by approved domains</b-form-radio>
  59. </b-form-group>
  60. <p class="text-muted">Set the allowed instances to browse</p>
  61. </div>
  62. <div v-if="server.mode == 'allowlist'">
  63. <b-form-group label="Allowed Domains">
  64. <b-form-textarea
  65. v-model="server.domains"
  66. placeholder="Add domains to allow here, separated by commas"
  67. rows="3"
  68. max-rows="6"
  69. ></b-form-textarea>
  70. </b-form-group>
  71. </div>
  72. </div>
  73. </div>
  74. </div>
  75. <div class="col-md-2 col-lg-3">
  76. <button v-if="hasChanged" class="btn btn-primary btn-block primary font-weight-bold" @click="saveFeatures">Save changes</button>
  77. </div>
  78. </div>
  79. </div>
  80. </div>
  81. </template>
  82. <script type="text/javascript">
  83. import Drawer from './../partials/drawer.vue';
  84. import Sidebar from './../partials/sidebar.vue';
  85. import StatusCard from './../partials/TimelineStatus.vue';
  86. export default {
  87. components: {
  88. "drawer": Drawer,
  89. "sidebar": Sidebar,
  90. "status-card": StatusCard
  91. },
  92. data() {
  93. return {
  94. isLoaded: false,
  95. isLoading: true,
  96. profile: window._sharedData.user,
  97. breadcrumbItems: [
  98. {
  99. text: 'Discover',
  100. href: '/i/web/discover'
  101. },
  102. {
  103. text: 'Settings',
  104. active: true
  105. }
  106. ],
  107. hasChanged: false,
  108. features: {},
  109. original: undefined,
  110. hashtags: { enabled: undefined },
  111. memories: { enabled: undefined },
  112. insights: { enabled: undefined },
  113. friends: { enabled: undefined },
  114. server: { enabled: undefined, mode: 'allowlist', domains: '' },
  115. }
  116. },
  117. watch: {
  118. hashtags: {
  119. deep: true,
  120. handler: function(val, old) {
  121. this.updateFeatures('hashtags');
  122. },
  123. },
  124. memories: {
  125. deep: true,
  126. handler: function(val, old) {
  127. this.updateFeatures('memories');
  128. },
  129. },
  130. insights: {
  131. deep: true,
  132. handler: function(val, old) {
  133. this.updateFeatures('insights');
  134. },
  135. },
  136. friends: {
  137. deep: true,
  138. handler: function(val, old) {
  139. this.updateFeatures('friends');
  140. },
  141. },
  142. server: {
  143. deep: true,
  144. handler: function(val, old) {
  145. this.updateFeatures('server');
  146. },
  147. }
  148. },
  149. beforeMount() {
  150. if(!this.profile.is_admin) {
  151. this.$router.push('/i/web/discover');
  152. }
  153. this.fetchConfig();
  154. },
  155. methods: {
  156. fetchConfig() {
  157. axios.get('/api/pixelfed/v2/discover/meta')
  158. .then(res => {
  159. this.original = res.data;
  160. this.storeOriginal(res.data);
  161. })
  162. },
  163. storeOriginal(data) {
  164. this.friends.enabled = data.friends.enabled;
  165. this.hashtags.enabled = data.hashtags.enabled;
  166. this.insights.enabled = data.insights.enabled;
  167. this.memories.enabled = data.memories.enabled;
  168. this.server = {
  169. domains: data.server.domains,
  170. enabled: data.server.enabled,
  171. mode: data.server.mode
  172. };
  173. this.isLoaded = true;
  174. },
  175. updateFeatures(id) {
  176. if(!this.isLoaded) {
  177. return;
  178. }
  179. let changed = false;
  180. if(this.friends.enabled !== this.original.friends.enabled) {
  181. changed = true;
  182. }
  183. if(this.hashtags.enabled !== this.original.hashtags.enabled) {
  184. changed = true;
  185. }
  186. if(this.insights.enabled !== this.original.insights.enabled) {
  187. changed = true;
  188. }
  189. if(this.memories.enabled !== this.original.memories.enabled) {
  190. changed = true;
  191. }
  192. if(this.server.enabled !== this.original.server.enabled) {
  193. changed = true;
  194. }
  195. if(this.server.domains !== this.original.server.domains) {
  196. changed = true;
  197. }
  198. if(this.server.mode !== this.original.server.mode) {
  199. changed = true;
  200. }
  201. // if(JSON.stringify(this.server) !== JSON.stringify(this.original.server)) {
  202. // changed = true;
  203. // }
  204. this.hasChanged = changed;
  205. },
  206. saveFeatures() {
  207. axios.post('/api/pixelfed/v2/discover/admin/features', {
  208. features: {
  209. friends: this.friends,
  210. hashtags: this.hashtags,
  211. insights: this.insights,
  212. memories: this.memories,
  213. server: this.server
  214. }
  215. })
  216. .then(res => {
  217. // let data = {
  218. // friends: res.data.friends,
  219. // hashtags: res.data.hashtags,
  220. // insights: res.data.insights,
  221. // memories: res.data.memories,
  222. // server: res.data.server
  223. // }
  224. // this.original = data;
  225. this.server = res.data.server;
  226. this.$bvToast.toast('Successfully updated settings!', {
  227. title: 'Discover Settings',
  228. autoHideDelay: 5000,
  229. appendToast: true,
  230. variant: 'success'
  231. })
  232. })
  233. }
  234. }
  235. }
  236. </script>
  237. <style lang="scss" scoped>
  238. .discover-admin-settings-component {
  239. .bg-stellar {
  240. background: #7474BF;
  241. background: -webkit-linear-gradient(to right, #348AC7, #7474BF);
  242. background: linear-gradient(to right, #348AC7, #7474BF);
  243. }
  244. .font-default {
  245. font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
  246. letter-spacing: -0.7px;
  247. }
  248. .active {
  249. font-weight: 700;
  250. }
  251. }
  252. </style>