Compare commits
16 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
468ff7037f | ||
![]() |
df23504ccf | ||
![]() |
66e3cb8eda | ||
![]() |
6ddd2389dc | ||
![]() |
402efb8c50 | ||
![]() |
7b6eae0ce4 | ||
![]() |
26ce9725ce | ||
![]() |
ebfaa18f12 | ||
![]() |
cc81d41a05 | ||
![]() |
212176ee5c | ||
![]() |
a63ec05e41 | ||
![]() |
0dcb527bf3 | ||
![]() |
54710f17fc | ||
![]() |
e58a6593c0 | ||
![]() |
62132570e1 | ||
![]() |
9f0b8ba2f8 |
126
docs/setup.fr.md
Normal file
126
docs/setup.fr.md
Normal file
@@ -0,0 +1,126 @@
|
||||
Guide d'installation et de configuration de Misskey
|
||||
================================================================
|
||||
|
||||
Nous vous remerçions de l'intrêt que vous manifestez pour l'installation de votre propre instance Misskey !
|
||||
Ce guide décrit les étapes à suivre afin d'installer et de configurer une instance Misskey.
|
||||
|
||||
[La version en japonnais est également disponible sur - 日本語版もあります](./setup.ja.md)
|
||||
|
||||
----------------------------------------------------------------
|
||||
|
||||
*1.* Création de l'utilisateur Misskey
|
||||
----------------------------------------------------------------
|
||||
Lancer misskey en tant qu'utilisateur est une mauvaise idée, nous avons besoin de créer un utilisateur dédié.
|
||||
Sur Debian, à titre d'exemple :
|
||||
|
||||
```
|
||||
adduser --disabled-password --disabled-login misskey
|
||||
```
|
||||
|
||||
*2.* Installation des dépendances
|
||||
----------------------------------------------------------------
|
||||
Installez les paquets suivants :
|
||||
|
||||
#### Dépendences :package:
|
||||
* **[Node.js](https://nodejs.org/en/)** >= 10.0.0
|
||||
* **[MongoDB](https://www.mongodb.com/)** >= 3.6
|
||||
|
||||
##### Optionnels
|
||||
* [Redis](https://redis.io/)
|
||||
* Redis est optionnel mais nous vous recommandons vivement de l'installer
|
||||
* [Elasticsearch](https://www.elastic.co/) - requis pour pouvoir activer la fonctionnalité de recherche
|
||||
|
||||
*3.* Paramètrage de MongoDB
|
||||
----------------------------------------------------------------
|
||||
En mode root :
|
||||
1. `mongo` Accédez au shell de mango
|
||||
2. `use misskey` Utilisez la base de données misskey
|
||||
3. `db.users.save( {dummy:"dummy"} )` Write dummy data to initialize the db.
|
||||
4. `db.createUser( { user: "misskey", pwd: "<password>", roles: [ { role: "readWrite", db: "misskey" } ] } )` Créez l'utilisateur misskey.
|
||||
5. `exit` Vous avez terminé !
|
||||
|
||||
*4.* Installation de Misskey
|
||||
----------------------------------------------------------------
|
||||
1. `su - misskey` Basculez vers l'utilisateur misskey.
|
||||
2. `git clone -b master git://github.com/syuilo/misskey.git` Clonez la branche master du dépôt misskey.
|
||||
3. `cd misskey` Accédez au dossier misskey.
|
||||
4. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Télécharge la [version la plus récente](https://github.com/syuilo/misskey/releases/latest)
|
||||
5. `npm install` Installez les dépendances de misskey.
|
||||
|
||||
*(optionnel)* Génération des clés VAPID
|
||||
----------------------------------------------------------------
|
||||
Si vous désirez activer ServiceWorker, vous devez générer les clés VAPID :
|
||||
Unless you have set your global node_modules location elsewhere, vous devez lancer ceci en mode root.
|
||||
|
||||
``` shell
|
||||
npm install web-push -g
|
||||
web-push generate-vapid-keys
|
||||
```
|
||||
|
||||
*5.* Création du fichier de configuration
|
||||
----------------------------------------------------------------
|
||||
1. `cp .config/example.yml .config/default.yml` Copiez le fichier `.config/example.yml` et renommez-le `default.yml`.
|
||||
2. Editez le fichier `default.yml`
|
||||
|
||||
*6.* Construction de Misskey
|
||||
----------------------------------------------------------------
|
||||
|
||||
Construisez Misskey comme ceci :
|
||||
|
||||
`npm run build`
|
||||
|
||||
Si vous êtes sous Debian, vous serez amené à installer les paquets `build-essential`, `python`.
|
||||
|
||||
Si vous rencontrez des erreurs concernant certains modules, utilisez node-gyp:
|
||||
|
||||
1. `npm install -g node-gyp`
|
||||
2. `node-gyp configure`
|
||||
3. `node-gyp build`
|
||||
4. `npm run build`
|
||||
|
||||
*7.* C'est tout.
|
||||
----------------------------------------------------------------
|
||||
Excellent ! Maintenant, vous avez un environnement prêt pour lancer Misskey
|
||||
|
||||
### Lancement conventionnel
|
||||
Lancez tout simplement `npm start`. Bonne chance et amusez-vous bien !
|
||||
|
||||
### Démarrage avec systemd
|
||||
|
||||
1. Créez une service systemd sur : `/etc/systemd/system/misskey.service`
|
||||
2. Editez-le puis copiez et coller ceci dans le fichier :
|
||||
|
||||
```
|
||||
[Unit]
|
||||
Description=Misskey daemon
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=misskey
|
||||
ExecStart=/usr/bin/npm start
|
||||
WorkingDirectory=/home/misskey/misskey
|
||||
TimeoutSec=60
|
||||
StandardOutput=syslog
|
||||
StandardError=syslog
|
||||
SyslogIdentifier=misskey
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
3. `systemctl daemon-reload ; systemctl enable misskey` Redémarre systemd et active le service misskey.
|
||||
4. `systemctl start misskey` Démarre le service misskey.
|
||||
|
||||
Vous pouvez vérifier si le service a démarré en utilisant la commande `systemctl status misskey`.
|
||||
|
||||
### Méthode de mise à jour vers la plus récente version de Misskey
|
||||
1. `git fetch`
|
||||
2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
|
||||
3. `npm install`
|
||||
4. `npm run build`
|
||||
5. Consultez [ChangeLog](../CHANGELOG.md) pour les information de migration.
|
||||
|
||||
----------------------------------------------------------------
|
||||
|
||||
Si vous rencontrez des difficultés ou avez d'autres questions, n'hésitez pas à nous contacter !
|
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"name": "misskey",
|
||||
"author": "syuilo <i@syuilo.com>",
|
||||
"version": "10.49.1",
|
||||
"clientVersion": "2.0.11745",
|
||||
"version": "10.49.2",
|
||||
"clientVersion": "2.0.11761",
|
||||
"codename": "nighthike",
|
||||
"main": "./built/index.js",
|
||||
"private": true,
|
||||
@@ -198,6 +198,7 @@
|
||||
"summaly": "2.2.0",
|
||||
"systeminformation": "3.47.0",
|
||||
"syuilo-password-strength": "0.0.1",
|
||||
"terser-webpack-plugin": "1.1.0",
|
||||
"textarea-caret": "3.1.0",
|
||||
"tinycolor2": "1.4.1",
|
||||
"tmp": "0.0.33",
|
||||
|
@@ -9,14 +9,11 @@ import './style.styl';
|
||||
|
||||
import init from '../init';
|
||||
import Index from './views/index.vue';
|
||||
import * as config from '../config';
|
||||
|
||||
/**
|
||||
* init
|
||||
*/
|
||||
init(launch => {
|
||||
document.title = `${config.name} | %i18n:common.application-authorization%`;
|
||||
|
||||
// Init router
|
||||
const router = new VueRouter({
|
||||
mode: 'history',
|
||||
|
@@ -66,7 +66,7 @@ export default function<T extends object>(data: {
|
||||
|
||||
this.bakeProps();
|
||||
|
||||
(this as any).api('i/update_widget', {
|
||||
this.$root.api('i/update_widget', {
|
||||
id: this.id,
|
||||
data: this.props
|
||||
});
|
||||
|
@@ -37,6 +37,8 @@
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../../i18n';
|
||||
import { lib } from 'emojilib';
|
||||
import { faAsterisk, faLeaf, faUtensils, faFutbol, faCity, faDice } from '@fortawesome/free-solid-svg-icons';
|
||||
import { faHeart, faFlag } from '@fortawesome/free-regular-svg-icons';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('common/views/components/emoji-picker.vue'),
|
||||
@@ -48,7 +50,7 @@ export default Vue.extend({
|
||||
categories: [{
|
||||
ref: 'customEmojiSection',
|
||||
text: this.$t('custom-emoji'),
|
||||
icon: ['fas', 'asterisk'],
|
||||
icon: faAsterisk,
|
||||
isActive: true
|
||||
}, {
|
||||
name: 'people',
|
||||
@@ -60,43 +62,43 @@ export default Vue.extend({
|
||||
name: 'animals_and_nature',
|
||||
ref: 'animalsAndNatureSection',
|
||||
text: this.$t('animals-and-nature'),
|
||||
icon: ['fas', 'leaf'],
|
||||
icon: faLeaf,
|
||||
isActive: false
|
||||
}, {
|
||||
name: 'food_and_drink',
|
||||
ref: 'foodAndDrinkSection',
|
||||
text: this.$t('food-and-drink'),
|
||||
icon: ['fas', 'utensils'],
|
||||
icon: faUtensils,
|
||||
isActive: false
|
||||
}, {
|
||||
name: 'activity',
|
||||
ref: 'activitySection',
|
||||
text: this.$t('activity'),
|
||||
icon: ['fas', 'futbol'],
|
||||
icon: faFutbol,
|
||||
isActive: false
|
||||
}, {
|
||||
name: 'travel_and_places',
|
||||
ref: 'travelAndPlacesSection',
|
||||
text: this.$t('travel-and-places'),
|
||||
icon: ['fas', 'city'],
|
||||
icon: faCity,
|
||||
isActive: false
|
||||
}, {
|
||||
name: 'objects',
|
||||
ref: 'objectsSection',
|
||||
text: this.$t('objects'),
|
||||
icon: ['fas', 'poo-storm'],
|
||||
icon: faDice,
|
||||
isActive: false
|
||||
}, {
|
||||
name: 'symbols',
|
||||
ref: 'symbolsSection',
|
||||
text: this.$t('symbols'),
|
||||
icon: ['far', 'heart'],
|
||||
icon: faHeart,
|
||||
isActive: false
|
||||
}, {
|
||||
name: 'flags',
|
||||
ref: 'flagsSection',
|
||||
text: this.$t('flags'),
|
||||
icon: ['far', 'flag'],
|
||||
icon: faFlag,
|
||||
isActive: false
|
||||
}]
|
||||
}
|
||||
|
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="mk-github-setting">
|
||||
<p>{{ $t('description') }}<a :href="`${docsUrl}/link-to-github`" target="_blank">{{ $t('detail') }}</a></p>
|
||||
<p>{{ $t('description') }}</p>
|
||||
<p class="account" v-if="$store.state.i.github" :title="`GitHub ID: ${$store.state.i.github.id}`">{{ $t('connected-to') }}: <a :href="`https://github.com/${$store.state.i.github.login}`" target="_blank">@{{ $store.state.i.github.login }}</a></p>
|
||||
<p>
|
||||
<a :href="`${apiUrl}/connect/github`" target="_blank" @click.prevent="connect">{{ $store.state.i.github ? this.$t('reconnect') : this.$t('connect') }}</a>
|
||||
@@ -14,15 +14,14 @@
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../../i18n';
|
||||
import { apiUrl, docsUrl } from '../../../config';
|
||||
import { apiUrl } from '../../../config';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('common/views/components/github-setting.vue'),
|
||||
data() {
|
||||
return {
|
||||
form: null,
|
||||
apiUrl,
|
||||
docsUrl
|
||||
apiUrl
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
|
@@ -1,14 +1,8 @@
|
||||
import Vue from 'vue';
|
||||
|
||||
import followButton from './follow-button.vue';
|
||||
import muteAndBlock from './mute-and-block.vue';
|
||||
import error from './error.vue';
|
||||
import apiSettings from './api-settings.vue';
|
||||
import passwordSettings from './password-settings.vue';
|
||||
import driveSettings from './drive-settings.vue';
|
||||
import profileEditor from './profile-editor.vue';
|
||||
import noteSkeleton from './note-skeleton.vue';
|
||||
import theme from './theme.vue';
|
||||
import instance from './instance.vue';
|
||||
import cwButton from './cw-button.vue';
|
||||
import tagCloud from './tag-cloud.vue';
|
||||
@@ -28,7 +22,6 @@ import pollEditor from './poll-editor.vue';
|
||||
import reactionIcon from './reaction-icon.vue';
|
||||
import reactionsViewer from './reactions-viewer.vue';
|
||||
import time from './time.vue';
|
||||
import timer from './timer.vue';
|
||||
import mediaList from './media-list.vue';
|
||||
import uploader from './uploader.vue';
|
||||
import streamIndicator from './stream-indicator.vue';
|
||||
@@ -53,14 +46,8 @@ import formButton from './ui/form/button.vue';
|
||||
import formRadio from './ui/form/radio.vue';
|
||||
|
||||
Vue.component('mk-follow-button', followButton);
|
||||
Vue.component('mk-mute-and-block', muteAndBlock);
|
||||
Vue.component('mk-error', error);
|
||||
Vue.component('mk-api-settings', apiSettings);
|
||||
Vue.component('mk-password-settings', passwordSettings);
|
||||
Vue.component('mk-drive-settings', driveSettings);
|
||||
Vue.component('mk-profile-editor', profileEditor);
|
||||
Vue.component('mk-note-skeleton', noteSkeleton);
|
||||
Vue.component('mk-theme', theme);
|
||||
Vue.component('mk-instance', instance);
|
||||
Vue.component('mk-cw-button', cwButton);
|
||||
Vue.component('mk-tag-cloud', tagCloud);
|
||||
@@ -80,7 +67,6 @@ Vue.component('mk-poll-editor', pollEditor);
|
||||
Vue.component('mk-reaction-icon', reactionIcon);
|
||||
Vue.component('mk-reactions-viewer', reactionsViewer);
|
||||
Vue.component('mk-time', time);
|
||||
Vue.component('mk-timer', timer);
|
||||
Vue.component('mk-media-list', mediaList);
|
||||
Vue.component('mk-uploader', uploader);
|
||||
Vue.component('mk-stream-indicator', streamIndicator);
|
||||
|
@@ -8,7 +8,7 @@
|
||||
<p class="empty" v-if="!init && messages.length == 0"><fa icon="info-circle"/>{{ $t('empty') }}</p>
|
||||
<p class="no-history" v-if="!init && messages.length > 0 && !existMoreMessages"><fa icon="flag"/>{{ $t('no-history') }}</p>
|
||||
<button class="more" :class="{ fetching: fetchingMoreMessages }" v-if="existMoreMessages" @click="fetchMoreMessages" :disabled="fetchingMoreMessages">
|
||||
<template v-if="fetchingMoreMessages"><fa icon="spinner .pulse" fixed-width/></template>{{ fetchingMoreMessages ? $t('@.loading') : $t('@.load-more') }}
|
||||
<template v-if="fetchingMoreMessages"><fa icon="spinner" pulse fixed-width/></template>{{ fetchingMoreMessages ? $t('@.loading') : $t('@.load-more') }}
|
||||
</button>
|
||||
<template v-for="(message, i) in _messages">
|
||||
<x-message :message="message" :key="message.id"/>
|
||||
|
@@ -45,7 +45,7 @@
|
||||
</template>
|
||||
</div>
|
||||
<p class="no-history" v-if="!fetching && messages.length == 0">{{ $t('no-history') }}</p>
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
@@ -10,7 +10,7 @@
|
||||
<span>{{ $t('username') }}</span>
|
||||
<span slot="prefix">@</span>
|
||||
<span slot="suffix">@{{ host }}</span>
|
||||
<p slot="desc" v-if="usernameState == 'wait'" style="color:#999"><fa icon="spinner .pulse" fixed-width/> {{ $t('checking') }}</p>
|
||||
<p slot="desc" v-if="usernameState == 'wait'" style="color:#999"><fa icon="spinner" pulse fixed-width/> {{ $t('checking') }}</p>
|
||||
<p slot="desc" v-if="usernameState == 'ok'" style="color:#3CB7B5"><fa icon="check" fixed-width/> {{ $t('available') }}</p>
|
||||
<p slot="desc" v-if="usernameState == 'unavailable'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('unavailable') }}</p>
|
||||
<p slot="desc" v-if="usernameState == 'error'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('error') }}</p>
|
||||
|
@@ -1,11 +1,11 @@
|
||||
<template>
|
||||
<div class="mk-stream-indicator">
|
||||
<p v-if="stream.state == 'initializing'">
|
||||
<fa icon="spinner .pulse"/>
|
||||
<fa icon="spinner" pulse/>
|
||||
<span>{{ $t('connecting') }}<mk-ellipsis/></span>
|
||||
</p>
|
||||
<p v-if="stream.state == 'reconnecting'">
|
||||
<fa icon="spinner .pulse"/>
|
||||
<fa icon="spinner" pulse/>
|
||||
<span>{{ $t('reconnecting') }}<mk-ellipsis/></span>
|
||||
</p>
|
||||
<p v-if="stream.state == 'connected'">
|
||||
|
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="jtivnzhfwquxpsfidertopbmwmchmnmo">
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<p class="empty" v-else-if="tags.length == 0"><fa icon="exclamation-circle"/>{{ $t('empty') }}</p>
|
||||
<div v-else>
|
||||
<vue-word-cloud
|
||||
|
@@ -1,49 +0,0 @@
|
||||
<template>
|
||||
<time class="mk-time">
|
||||
{{ hh }}:{{ mm }}:{{ ss }}
|
||||
</time>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
|
||||
export default Vue.extend({
|
||||
props: {
|
||||
time: {
|
||||
type: [Date, String],
|
||||
required: true
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
tickId: null,
|
||||
hh: null,
|
||||
mm: null,
|
||||
ss: null
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
_time(): Date {
|
||||
return typeof this.time == 'string' ? new Date(this.time) : this.time;
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.tick();
|
||||
this.tickId = setInterval(this.tick, 1000);
|
||||
},
|
||||
destroyed() {
|
||||
clearInterval(this.tickId);
|
||||
},
|
||||
methods: {
|
||||
tick() {
|
||||
const now = new Date().getTime();
|
||||
const start = this._time.getTime();
|
||||
const ago = Math.floor((now - start) / 1000);
|
||||
|
||||
this.hh = Math.floor(ago / (60 * 60)).toString().padStart(2, '0');
|
||||
this.mm = Math.floor(ago / 60).toString().padStart(2, '0');
|
||||
this.ss = (ago % 60).toString().padStart(2, '0');
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="csqvmxybqbycalfhkxvyfrgbrdalkaoc">
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<p class="empty" v-else-if="stats.length == 0"><fa icon="exclamation-circle"/>{{ $t('empty') }}</p>
|
||||
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
||||
<transition-group v-else tag="div" name="chart">
|
||||
|
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="mk-twitter-setting">
|
||||
<p>{{ $t('description') }}<a :href="`${docsUrl}/link-to-twitter`" target="_blank">{{ $t('detail') }}</a></p>
|
||||
<p>{{ $t('description') }}</p>
|
||||
<p class="account" v-if="$store.state.i.twitter" :title="`Twitter ID: ${$store.state.i.twitter.userId}`">{{ $t('connected-to') }}: <a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p>
|
||||
<p>
|
||||
<a :href="`${apiUrl}/connect/twitter`" target="_blank" @click.prevent="connect">{{ $store.state.i.twitter ? this.$t('reconnect') : this.$t('connect') }}</a>
|
||||
@@ -14,15 +14,14 @@
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../../i18n';
|
||||
import { apiUrl, docsUrl } from '../../../config';
|
||||
import { apiUrl } from '../../../config';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('common/views/components/twitter-setting.vue'),
|
||||
data() {
|
||||
return {
|
||||
form: null,
|
||||
apiUrl,
|
||||
docsUrl
|
||||
apiUrl
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
|
@@ -3,7 +3,7 @@
|
||||
<ol v-if="uploads.length > 0">
|
||||
<li v-for="ctx in uploads" :key="ctx.id">
|
||||
<div class="img" :style="{ backgroundImage: `url(${ ctx.img })` }"></div>
|
||||
<p class="name"><fa icon="spinner .pulse"/>{{ ctx.name }}</p>
|
||||
<p class="name"><fa icon="spinner" pulse/>{{ ctx.name }}</p>
|
||||
<p class="status">
|
||||
<span class="initing" v-if="ctx.progress == undefined">{{ $t('waiting') }}<mk-ellipsis/></span>
|
||||
<span class="kb" v-if="ctx.progress != undefined">{{ String(Math.floor(ctx.progress.value / 1024)).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,') }}<i>KB</i> / {{ String(Math.floor(ctx.progress.max / 1024)).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,') }}<i>KB</i></span>
|
||||
|
@@ -25,7 +25,7 @@
|
||||
<template v-else-if="!user.isFollowing && user.isLocked"><fa icon="plus"/> {{ $t('follow-request') }}</template>
|
||||
<template v-else-if="!user.isFollowing && !user.isLocked"><fa icon="plus"/> {{ $t('follow') }}</template>
|
||||
</template>
|
||||
<template v-else><fa icon="spinner .pulse" fixed-width/></template>
|
||||
<template v-else><fa icon="spinner" pulse fixed-width/></template>
|
||||
</button>
|
||||
</div>
|
||||
</template>
|
||||
|
@@ -3,7 +3,7 @@
|
||||
<mk-widget-container :show-header="props.design == 0" :naked="props.design == 2">
|
||||
<template slot="header"><fa icon="camera"/>{{ $t('title') }}</template>
|
||||
|
||||
<p :class="$style.fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<p :class="$style.fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<div :class="$style.stream" v-if="!fetching && images.length > 0">
|
||||
<div v-for="image in images"
|
||||
:class="$style.img"
|
||||
|
@@ -5,7 +5,7 @@
|
||||
<button slot="func" title="設定" @click="setting"><fa icon="cog"/></button>
|
||||
|
||||
<div class="mkw-rss--body" :data-mobile="platform == 'mobile'">
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<div class="feed" v-else>
|
||||
<a v-for="item in items" :href="item.link" target="_blank">{{ item.title }}</a>
|
||||
</div>
|
||||
|
@@ -2,7 +2,7 @@
|
||||
<div class="memory">
|
||||
<x-pie class="pie" :value="usage"/>
|
||||
<div>
|
||||
<p><fa icon="flask"/>Memory</p>
|
||||
<p><fa icon="memory"/>Memory</p>
|
||||
<p>Total: {{ total | bytes(1) }}</p>
|
||||
<p>Used: {{ used | bytes(1) }}</p>
|
||||
<p>Free: {{ free | bytes(1) }}</p>
|
||||
|
@@ -4,7 +4,7 @@
|
||||
<template slot="header"><fa icon="server"/>{{ $t('title') }}</template>
|
||||
<button slot="func" @click="toggle" :title="$t('toggle')"><fa icon="sort"/></button>
|
||||
|
||||
<p :class="$style.fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<p :class="$style.fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<template v-if="!fetching">
|
||||
<x-cpu-memory v-show="props.view == 0" :connection="connection"/>
|
||||
<x-cpu v-show="props.view == 1" :connection="connection" :meta="meta"/>
|
||||
|
@@ -4,7 +4,7 @@
|
||||
<template slot="header"><fa icon="chart-bar"/>{{ $t('title') }}</template>
|
||||
<button slot="func" :title="$t('toggle')" @click="toggle"><fa icon="sort"/></button>
|
||||
|
||||
<p :class="$style.fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<p :class="$style.fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<template v-else>
|
||||
<x-calendar v-show="view == 0" :data="[].concat(activity)"/>
|
||||
<x-chart v-show="view == 1" :data="[].concat(activity)"/>
|
||||
|
@@ -11,7 +11,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<p class="empty" v-if="!fetching && users.length == 0">{{ $t('empty') }}</p>
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('fetching') }}<mk-ellipsis/></p>
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('fetching') }}<mk-ellipsis/></p>
|
||||
<a class="refresh" @click="refresh">{{ $t('refresh') }}</a>
|
||||
<button class="close" @click="destroyDom()" :title="$t('title')"><fa icon="times"/></button>
|
||||
</div>
|
||||
|
@@ -16,7 +16,6 @@ import noteForm from './post-form.vue';
|
||||
import renoteForm from './renote-form.vue';
|
||||
import notePreview from './note-preview.vue';
|
||||
import noteDetail from './note-detail.vue';
|
||||
import settings from './settings.vue';
|
||||
import calendar from './calendar.vue';
|
||||
import activity from './activity.vue';
|
||||
import friendsMaker from './friends-maker.vue';
|
||||
@@ -40,7 +39,6 @@ Vue.component('mk-post-form', noteForm);
|
||||
Vue.component('mk-renote-form', renoteForm);
|
||||
Vue.component('mk-note-preview', notePreview);
|
||||
Vue.component('mk-note-detail', noteDetail);
|
||||
Vue.component('mk-settings', settings);
|
||||
Vue.component('mk-calendar', calendar);
|
||||
Vue.component('mk-activity', activity);
|
||||
Vue.component('mk-friends-maker', friendsMaker);
|
||||
|
@@ -8,7 +8,7 @@
|
||||
:disabled="conversationFetching"
|
||||
>
|
||||
<template v-if="!conversationFetching"><fa icon="ellipsis-v"/></template>
|
||||
<template v-if="conversationFetching"><fa icon="spinner .pulse"/></template>
|
||||
<template v-if="conversationFetching"><fa icon="spinner" pulse/></template>
|
||||
</button>
|
||||
<div class="conversation">
|
||||
<x-sub v-for="note in conversation" :key="note.id" :note="note"/>
|
||||
|
@@ -26,7 +26,7 @@
|
||||
<footer v-if="more">
|
||||
<button @click="loadMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }">
|
||||
<template v-if="!moreFetching">{{ $t('@.load-more') }}</template>
|
||||
<template v-if="moreFetching"><fa icon="spinner .pulse" fixed-width/></template>
|
||||
<template v-if="moreFetching"><fa icon="spinner" pulse fixed-width/></template>
|
||||
</button>
|
||||
</footer>
|
||||
</div>
|
||||
|
@@ -105,7 +105,7 @@
|
||||
</component>
|
||||
</div>
|
||||
<button class="more" :class="{ fetching: fetchingMoreNotifications }" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications">
|
||||
<template v-if="fetchingMoreNotifications"><fa icon="spinner .pulse" fixed-width/></template>{{ fetchingMoreNotifications ? $t('@.loading') : $t('@.load-more') }}
|
||||
<template v-if="fetchingMoreNotifications"><fa icon="spinner" pulse fixed-width/></template>{{ fetchingMoreNotifications ? $t('@.loading') : $t('@.load-more') }}
|
||||
</button>
|
||||
<p class="empty" v-if="notifications.length == 0 && !fetching">{{ $t('empty') }}</p>
|
||||
</div>
|
||||
|
@@ -41,7 +41,7 @@
|
||||
<button class="drive" :title="$t('attach-media-from-drive')" @click="chooseFileFromDrive"><fa icon="cloud"/></button>
|
||||
<button class="kao" :title="$t('insert-a-kao')" @click="kao"><fa :icon="['far', 'smile']"/></button>
|
||||
<button class="poll" :title="$t('create-poll')" @click="poll = !poll"><fa icon="chart-pie"/></button>
|
||||
<button class="cw" :title="$t('hide-contents')" @click="useCw = !useCw"><fa icon="eye-slash"/></button>
|
||||
<button class="cw" :title="$t('hide-contents')" @click="useCw = !useCw"><fa :icon="['far', 'eye-slash']"/></button>
|
||||
<button class="geo" :title="$t('attach-location-information')" @click="geo ? removeGeo() : setGeo()"><fa icon="map-marker-alt"/></button>
|
||||
<button class="visibility" :title="$t('visibility')" @click="setVisibility" ref="visibilityButton">
|
||||
<span v-if="visibility === 'public'"><fa icon="globe"/></span>
|
||||
|
@@ -1,15 +1,21 @@
|
||||
<template>
|
||||
<mk-window ref="window" is-modal width="700px" height="550px" @closed="destroyDom">
|
||||
<span slot="header" :class="$style.header"><fa icon="cog"/>{{ $t('settings') }}</span>
|
||||
<mk-settings :initial-page="initialPage" @done="close"/>
|
||||
<x-settings :initial-page="initialPage" @done="close"/>
|
||||
</mk-window>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../../i18n';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('desktop/views/components/settings-window.vue'),
|
||||
|
||||
components: {
|
||||
XSettings: () => import('./settings.vue').then(m => m.default)
|
||||
},
|
||||
|
||||
props: {
|
||||
initialPage: {
|
||||
type: String,
|
||||
|
@@ -15,7 +15,7 @@
|
||||
</div>
|
||||
<div class="pages">
|
||||
<div class="profile" v-show="page == 'profile'">
|
||||
<mk-profile-editor/>
|
||||
<x-profile-editor/>
|
||||
|
||||
<ui-card>
|
||||
<div slot="title"><fa :icon="['fab', 'twitter']"/> {{ $t('twitter') }}</div>
|
||||
@@ -36,7 +36,7 @@
|
||||
<div slot="title"><fa icon="palette"/> {{ $t('theme') }}</div>
|
||||
|
||||
<section>
|
||||
<mk-theme/>
|
||||
<x-theme/>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
@@ -194,7 +194,7 @@
|
||||
</ui-card>
|
||||
|
||||
<div class="drive" v-if="page == 'drive'">
|
||||
<mk-drive-settings/>
|
||||
<x-drive-settings/>
|
||||
</div>
|
||||
|
||||
<ui-card class="hashtags" v-show="page == 'hashtags'">
|
||||
@@ -205,7 +205,7 @@
|
||||
</ui-card>
|
||||
|
||||
<div class="muteAndBlock" v-show="page == 'muteAndBlock'">
|
||||
<mk-mute-and-block/>
|
||||
<x-mute-and-block/>
|
||||
</div>
|
||||
|
||||
<ui-card class="apps" v-show="page == 'apps'">
|
||||
@@ -218,7 +218,7 @@
|
||||
<ui-card class="password" v-show="page == 'security'">
|
||||
<div slot="title"><fa icon="unlock-alt"/> {{ $t('password') }}</div>
|
||||
<section>
|
||||
<mk-password-settings/>
|
||||
<x-password-settings/>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
@@ -237,7 +237,7 @@
|
||||
</ui-card>
|
||||
|
||||
<div class="api" v-show="page == 'api'">
|
||||
<mk-api-settings/>
|
||||
<x-api-settings/>
|
||||
</div>
|
||||
|
||||
<ui-card class="other" v-show="page == 'other'">
|
||||
@@ -301,7 +301,13 @@ export default Vue.extend({
|
||||
X2fa,
|
||||
XApps,
|
||||
XSignins,
|
||||
XTags
|
||||
XTags,
|
||||
XTheme: () => import('../../../common/views/components/theme.vue').then(m => m.default),
|
||||
XDriveSettings: () => import('../../../common/views/components/drive-settings.vue').then(m => m.default),
|
||||
XMuteAndBlock: () => import('../../../common/views/components/mute-and-block.vue').then(m => m.default),
|
||||
XPasswordSettings: () => import('../../../common/views/components/password-settings.vue').then(m => m.default),
|
||||
XProfileEditor: () => import('../../../common/views/components/profile-editor.vue').then(m => m.default),
|
||||
XApiSettings: () => import('../../../common/views/components/api-settings.vue').then(m => m.default),
|
||||
},
|
||||
props: {
|
||||
initialPage: {
|
||||
|
@@ -31,7 +31,7 @@
|
||||
<footer v-if="more">
|
||||
<button @click="loadMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }">
|
||||
<template v-if="!moreFetching">{{ $t('@.load-more') }}</template>
|
||||
<template v-if="moreFetching"><fa icon="spinner .pulse" fixed-width/></template>
|
||||
<template v-if="moreFetching"><fa icon="spinner" pulse fixed-width/></template>
|
||||
</button>
|
||||
</footer>
|
||||
</div>
|
||||
|
@@ -17,7 +17,7 @@
|
||||
</template>
|
||||
</component>
|
||||
<button class="more" :class="{ fetching: fetchingMoreNotifications }" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications">
|
||||
<template v-if="fetchingMoreNotifications"><fa icon="spinner .pulse" fixed-width/></template>{{ fetchingMoreNotifications ? this.$t('@.loading') : this.$t('@.load-more') }}
|
||||
<template v-if="fetchingMoreNotifications"><fa icon="spinner" pulse fixed-width/></template>{{ fetchingMoreNotifications ? this.$t('@.loading') : this.$t('@.load-more') }}
|
||||
</button>
|
||||
<p class="empty" v-if="notifications.length == 0 && !fetching">{{ $t('empty') }}</p>
|
||||
</div>
|
||||
|
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div class="vahgrswmbzfdlmomxnqftuueyvwaafth">
|
||||
<p class="title"><fa icon="users"/>{{ $t('title') }}</p>
|
||||
<p class="initializing" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('loading') }}<mk-ellipsis/></p>
|
||||
<p class="initializing" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('loading') }}<mk-ellipsis/></p>
|
||||
<div v-if="!fetching && users.length > 0">
|
||||
<router-link v-for="user in users" :to="user | userPage" :key="user.id">
|
||||
<img :src="user.avatarUrl" :alt="user | userName" v-user-preview="user.id"/>
|
||||
|
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div class="hozptpaliadatkehcmcayizwzwwctpbc">
|
||||
<p class="title"><fa icon="users"/>{{ $t('title') }}</p>
|
||||
<p class="initializing" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('loading') }}<mk-ellipsis/></p>
|
||||
<p class="initializing" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('loading') }}<mk-ellipsis/></p>
|
||||
<template v-if="!fetching && users.length != 0">
|
||||
<div class="user" v-for="friend in users">
|
||||
<mk-avatar class="avatar" :user="friend"/>
|
||||
|
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div class="dzsuvbsrrrwobdxifudxuefculdfiaxd">
|
||||
<p class="title"><fa icon="camera"/>{{ $t('title') }}</p>
|
||||
<p class="initializing" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('loading') }}<mk-ellipsis/></p>
|
||||
<p class="initializing" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('loading') }}<mk-ellipsis/></p>
|
||||
<div class="stream" v-if="!fetching && images.length > 0">
|
||||
<div v-for="image in images" class="img"
|
||||
:style="`background-image: url(${image.thumbnailUrl})`"
|
||||
|
@@ -11,7 +11,7 @@
|
||||
<div class="action-form">
|
||||
<ui-button @click="user.isMuted ? unmute() : mute()" v-if="$store.state.i.id != user.id">
|
||||
<span v-if="user.isMuted"><fa icon="eye"/> {{ $t('unmute') }}</span>
|
||||
<span v-else><fa icon="eye-slash"/> {{ $t('mute') }}</span>
|
||||
<span v-else><fa :icon="['far', 'eye-slash']"/> {{ $t('mute') }}</span>
|
||||
</ui-button>
|
||||
<ui-button @click="user.isBlocking ? unblock() : block()" v-if="$store.state.i.id != user.id">
|
||||
<span v-if="user.isBlocking"><fa icon="user"/> {{ $t('unblock') }}</span>
|
||||
|
@@ -3,7 +3,7 @@
|
||||
<header>
|
||||
<span :data-active="mode == 'default'" @click="mode = 'default'"><fa :icon="['far', 'comment-alt']"/> {{ $t('default') }}</span>
|
||||
<span :data-active="mode == 'with-replies'" @click="mode = 'with-replies'"><fa icon="comments"/> {{ $t('with-replies') }}</span>
|
||||
<span :data-active="mode == 'with-media'" @click="mode = 'with-media'"><fa icon="images"/> {{ $t('with-media') }}</span>
|
||||
<span :data-active="mode == 'with-media'" @click="mode = 'with-media'"><fa :icon="['far', 'images']"/> {{ $t('with-media') }}</span>
|
||||
</header>
|
||||
<mk-notes ref="timeline" :more="existMore ? more : null">
|
||||
<p class="empty" slot="empty"><fa :icon="['far', 'comments']"/>{{ $t('empty') }}</p>
|
||||
|
@@ -50,7 +50,7 @@
|
||||
</div>
|
||||
|
||||
<div class="photos block">
|
||||
<header><fa icon="images"/> {{ $t('photos') }}</header>
|
||||
<header><fa :icon="['far', 'images']"/> {{ $t('photos') }}</header>
|
||||
<div>
|
||||
<div v-for="photo in photos" :style="`background-image: url(${photo.thumbnailUrl})`"></div>
|
||||
</div>
|
||||
|
@@ -11,7 +11,7 @@
|
||||
<mk-poll :note="poll"/>
|
||||
</div>
|
||||
<p class="empty" v-if="!fetching && poll == null">{{ $t('nothing') }}</p>
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
</div>
|
||||
</mk-widget-container>
|
||||
</div>
|
||||
|
@@ -5,7 +5,7 @@
|
||||
<button slot="func" :title="$t('title')" @click="fetch"><fa icon="sync"/></button>
|
||||
|
||||
<div class="mkw-trends--body">
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<div class="note" v-else-if="note != null">
|
||||
<p class="text"><router-link :to="note | notePage">{{ note.text }}</router-link></p>
|
||||
<p class="author">―<router-link :to="note.user | userPage">@{{ note.user | acct }}</router-link></p>
|
||||
|
@@ -5,7 +5,7 @@
|
||||
<button slot="func" :title="$t('title')" @click="refresh"><fa icon="sync"/></button>
|
||||
|
||||
<div class="mkw-users--body">
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<template v-else-if="users.length != 0">
|
||||
<div class="user" v-for="_user in users">
|
||||
<mk-avatar class="avatar" :user="_user"/>
|
||||
|
@@ -25,47 +25,120 @@ if (localStorage.getItem('theme') == null) {
|
||||
import { library } from '@fortawesome/fontawesome-svg-core';
|
||||
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';
|
||||
|
||||
/* なぜか動かない
|
||||
import faRetweet from '@fortawesome/free-solid-svg-icons/faRetweet';
|
||||
import faPlus from '@fortawesome/free-solid-svg-icons/faPlus';
|
||||
import faUser from '@fortawesome/free-solid-svg-icons/faUser';
|
||||
import faCog from '@fortawesome/free-solid-svg-icons/faCog';
|
||||
import faCheck from '@fortawesome/free-solid-svg-icons/faCheck';
|
||||
import faStar from '@fortawesome/free-solid-svg-icons/faStar';
|
||||
import faReply from '@fortawesome/free-solid-svg-icons/faReply';
|
||||
import faEllipsisH from '@fortawesome/free-solid-svg-icons/faEllipsisH';
|
||||
import faQuoteLeft from '@fortawesome/free-solid-svg-icons/faQuoteLeft';
|
||||
import faQuoteRight from '@fortawesome/free-solid-svg-icons/faQuoteRight';
|
||||
import faAngleUp from '@fortawesome/free-solid-svg-icons/faAngleUp';
|
||||
import faAngleDown from '@fortawesome/free-solid-svg-icons/faAngleDown';
|
||||
import faAt from '@fortawesome/free-solid-svg-icons/faAt';
|
||||
import faHashtag from '@fortawesome/free-solid-svg-icons/faHashtag';
|
||||
import faHome from '@fortawesome/free-solid-svg-icons/faHome';
|
||||
import faGlobe from '@fortawesome/free-solid-svg-icons/faGlobe';
|
||||
import faCircle from '@fortawesome/free-solid-svg-icons/faCircle';
|
||||
import faList from '@fortawesome/free-solid-svg-icons/faList';
|
||||
import faHeart from '@fortawesome/free-solid-svg-icons/faHeart';
|
||||
import faUnlock from '@fortawesome/free-solid-svg-icons/faUnlock';
|
||||
import faRssSquare from '@fortawesome/free-solid-svg-icons/faRssSquare';
|
||||
import faSort from '@fortawesome/free-solid-svg-icons/faSort';
|
||||
import faChartPie from '@fortawesome/free-solid-svg-icons/faChartPie';
|
||||
import faChartBar from '@fortawesome/free-solid-svg-icons/faChartBar';
|
||||
import faPencilAlt from '@fortawesome/free-solid-svg-icons/faPencilAlt';
|
||||
import faColumns from '@fortawesome/free-solid-svg-icons/faColumns';
|
||||
import faComments from '@fortawesome/free-solid-svg-icons/faComments';
|
||||
import faGamepad from '@fortawesome/free-solid-svg-icons/faGamepad';
|
||||
import faCloud from '@fortawesome/free-solid-svg-icons/faCloud';
|
||||
import faPowerOff from '@fortawesome/free-solid-svg-icons/faPowerOff';
|
||||
import faChevronCircleLeft from '@fortawesome/free-solid-svg-icons/faChevronCircleLeft';
|
||||
import faChevronCircleRight from '@fortawesome/free-solid-svg-icons/faChevronCircleRight';
|
||||
import faShareAlt from '@fortawesome/free-solid-svg-icons/faShareAlt';
|
||||
import faTimes from '@fortawesome/free-solid-svg-icons/faTimes';
|
||||
import faThumbtack from '@fortawesome/free-solid-svg-icons/faThumbtack';
|
||||
import faSearch from '@fortawesome/free-solid-svg-icons/faSearch';
|
||||
import {
|
||||
faRetweet,
|
||||
faPlus,
|
||||
faUser,
|
||||
faCog,
|
||||
faCheck,
|
||||
faStar,
|
||||
faReply,
|
||||
faEllipsisH,
|
||||
faQuoteLeft,
|
||||
faQuoteRight,
|
||||
faAngleUp,
|
||||
faAngleDown,
|
||||
faAt,
|
||||
faHashtag,
|
||||
faHome,
|
||||
faGlobe,
|
||||
faCircle,
|
||||
faList,
|
||||
faHeart,
|
||||
faUnlock,
|
||||
faRssSquare,
|
||||
faSort,
|
||||
faChartPie,
|
||||
faChartBar,
|
||||
faPencilAlt,
|
||||
faColumns,
|
||||
faComments,
|
||||
faGamepad,
|
||||
faCloud,
|
||||
faPowerOff,
|
||||
faChevronCircleLeft,
|
||||
faChevronCircleRight,
|
||||
faShareAlt,
|
||||
faTimes,
|
||||
faThumbtack,
|
||||
faSearch,
|
||||
faAngleRight,
|
||||
faWrench,
|
||||
faTerminal,
|
||||
faMoon,
|
||||
faPalette,
|
||||
faSlidersH,
|
||||
faDesktop,
|
||||
faVolumeUp,
|
||||
faLanguage,
|
||||
faInfoCircle,
|
||||
faExclamationTriangle,
|
||||
faKey,
|
||||
faBan,
|
||||
faCogs,
|
||||
faUnlockAlt,
|
||||
faPuzzlePiece,
|
||||
faMobileAlt,
|
||||
faSignInAlt,
|
||||
faSyncAlt,
|
||||
faPaperPlane,
|
||||
faUpload,
|
||||
faMapMarkerAlt,
|
||||
faEnvelope,
|
||||
faLock,
|
||||
faFolderOpen,
|
||||
faBirthdayCake,
|
||||
faImage,
|
||||
faEye,
|
||||
faDownload,
|
||||
faFileImport,
|
||||
faLink,
|
||||
faArrowRight,
|
||||
faICursor,
|
||||
faCaretRight,
|
||||
faReplyAll,
|
||||
faCamera,
|
||||
faMinus,
|
||||
faCaretDown,
|
||||
faCalculator,
|
||||
faUsers,
|
||||
faBars,
|
||||
faFileImage,
|
||||
faPollH,
|
||||
faFolder,
|
||||
faMicrochip,
|
||||
faMemory,
|
||||
faServer,
|
||||
faExclamationCircle,
|
||||
faSpinner,
|
||||
faBroadcastTower
|
||||
} from '@fortawesome/free-solid-svg-icons';
|
||||
|
||||
import farBell from '@fortawesome/free-regular-svg-icons/faBell';
|
||||
import farEnvelope from '@fortawesome/free-regular-svg-icons/faEnvelope';
|
||||
import farComments from '@fortawesome/free-regular-svg-icons/faComments';
|
||||
import {
|
||||
faBell as farBell,
|
||||
faEnvelope as farEnvelope,
|
||||
faComments as farComments,
|
||||
faTrashAlt as farTrashAlt,
|
||||
faWindowRestore as farWindowRestore,
|
||||
faFolder as farFolder,
|
||||
faLaugh as farLaugh,
|
||||
faSmile as farSmile,
|
||||
faEyeSlash as farEyeSlash,
|
||||
faFolderOpen as farFolderOpen,
|
||||
faSave as farSave,
|
||||
faImages as farImages,
|
||||
faChartBar as farChartBar,
|
||||
faCommentAlt as farCommentAlt,
|
||||
faClock as farClock,
|
||||
faCalendarAlt as farCalendarAlt,
|
||||
faHdd as farHdd,
|
||||
} from '@fortawesome/free-regular-svg-icons';
|
||||
|
||||
import {
|
||||
faTwitter as fabTwitter,
|
||||
faGithub as fabGithub,
|
||||
} from '@fortawesome/free-brands-svg-icons';
|
||||
import i18n from './i18n';
|
||||
|
||||
library.add(
|
||||
faRetweet,
|
||||
@@ -104,16 +177,78 @@ library.add(
|
||||
faTimes,
|
||||
faThumbtack,
|
||||
faSearch,
|
||||
faAngleRight,
|
||||
faWrench,
|
||||
faTerminal,
|
||||
faMoon,
|
||||
faPalette,
|
||||
faSlidersH,
|
||||
faDesktop,
|
||||
faVolumeUp,
|
||||
faLanguage,
|
||||
faInfoCircle,
|
||||
faExclamationTriangle,
|
||||
faKey,
|
||||
faBan,
|
||||
faCogs,
|
||||
faUnlockAlt,
|
||||
faPuzzlePiece,
|
||||
faMobileAlt,
|
||||
faSignInAlt,
|
||||
faSyncAlt,
|
||||
faPaperPlane,
|
||||
faUpload,
|
||||
faMapMarkerAlt,
|
||||
faEnvelope,
|
||||
faLock,
|
||||
faFolderOpen,
|
||||
faBirthdayCake,
|
||||
faImage,
|
||||
faEye,
|
||||
faDownload,
|
||||
faFileImport,
|
||||
faLink,
|
||||
faArrowRight,
|
||||
faICursor,
|
||||
faCaretRight,
|
||||
faReplyAll,
|
||||
faCamera,
|
||||
faMinus,
|
||||
faCaretDown,
|
||||
faCalculator,
|
||||
faUsers,
|
||||
faBars,
|
||||
faFileImage,
|
||||
faPollH,
|
||||
faFolder,
|
||||
faMicrochip,
|
||||
faMemory,
|
||||
faServer,
|
||||
faExclamationCircle,
|
||||
faSpinner,
|
||||
faBroadcastTower,
|
||||
|
||||
farBell,
|
||||
farEnvelope,
|
||||
farComments,
|
||||
farTrashAlt,
|
||||
farWindowRestore,
|
||||
farFolder,
|
||||
farLaugh,
|
||||
farSmile,
|
||||
farEyeSlash,
|
||||
farFolderOpen,
|
||||
farSave,
|
||||
farImages,
|
||||
farChartBar,
|
||||
farCommentAlt,
|
||||
farClock,
|
||||
farCalendarAlt,
|
||||
farHdd,
|
||||
|
||||
fabTwitter,
|
||||
fabGithub
|
||||
);
|
||||
*/
|
||||
|
||||
import { fas } from '@fortawesome/free-solid-svg-icons';
|
||||
import { far } from '@fortawesome/free-regular-svg-icons';
|
||||
|
||||
library.add(fas, far);
|
||||
//#endregion
|
||||
|
||||
Vue.use(Vuex);
|
||||
@@ -269,13 +404,7 @@ export default (callback: (launch: (router: VueRouter) => [Vue, MiOS]) => void,
|
||||
}, { passive: true });
|
||||
|
||||
const app = new Vue({
|
||||
i18n: new VueI18n({
|
||||
sync: false,
|
||||
locale: lang,
|
||||
messages: {
|
||||
[lang]: {}
|
||||
}
|
||||
}),
|
||||
i18n: i18n(),
|
||||
store: os.store,
|
||||
data() {
|
||||
return {
|
||||
|
@@ -27,7 +27,6 @@ import MkFollowing from './views/pages/following.vue';
|
||||
import MkFavorites from './views/pages/favorites.vue';
|
||||
import MkUserLists from './views/pages/user-lists.vue';
|
||||
import MkUserList from './views/pages/user-list.vue';
|
||||
import MkSettings from './views/pages/settings.vue';
|
||||
import MkReversi from './views/pages/games/reversi.vue';
|
||||
import MkTag from './views/pages/tag.vue';
|
||||
import MkShare from './views/pages/share.vue';
|
||||
@@ -137,7 +136,7 @@ init((launch) => {
|
||||
routes: [
|
||||
{ path: '/', name: 'index', component: MkIndex },
|
||||
{ path: '/signup', name: 'signup', component: MkSignup },
|
||||
{ path: '/i/settings', name: 'settings', component: MkSettings },
|
||||
{ path: '/i/settings', name: 'settings', component: () => import('./views/pages/settings.vue').then(m => m.default) },
|
||||
{ path: '/i/notifications', name: 'notifications', component: MkNotifications },
|
||||
{ path: '/i/favorites', name: 'favorites', component: MkFavorites },
|
||||
{ path: '/i/lists', name: 'user-lists', component: MkUserLists },
|
||||
@@ -154,7 +153,7 @@ init((launch) => {
|
||||
{ path: '/tags/:tag', component: MkTag },
|
||||
{ path: '/share', component: MkShare },
|
||||
{ path: '/reversi/:game?', name: 'reversi', component: MkReversi },
|
||||
{ path: '/@:user', component: MkUser },
|
||||
{ path: '/@:user', component: () => import('./views/pages/user.vue').then(m => m.default) },
|
||||
{ path: '/@:user/followers', component: MkFollowers },
|
||||
{ path: '/@:user/following', component: MkFollowing },
|
||||
{ path: '/notes/:note', component: MkNote },
|
||||
|
@@ -31,7 +31,7 @@
|
||||
<span class="created-at" @click="showCreatedAt"><fa :icon="['far', 'clock']"/><mk-time :time="file.createdAt"/></span>
|
||||
<template v-if="file.isSensitive">
|
||||
<span class="separator"></span>
|
||||
<span class="nsfw"><fa icon="eye-slash"/> {{ $t('nsfw') }}</span>
|
||||
<span class="nsfw"><fa :icon="['far', 'eye-slash']"/> {{ $t('nsfw') }}</span>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -15,7 +15,7 @@
|
||||
<span class="created-at"><fa :icon="['far', 'clock']"/><mk-time :time="file.createdAt"/></span>
|
||||
<template v-if="file.isSensitive">
|
||||
<span class="separator"></span>
|
||||
<span class="nsfw"><fa icon="eye-slash"/> {{ $t('nsfw') }}</span>
|
||||
<span class="nsfw"><fa :icon="['far', 'eye-slash']"/> {{ $t('nsfw') }}</span>
|
||||
</template>
|
||||
</footer>
|
||||
</div>
|
||||
|
@@ -51,8 +51,6 @@ export default Vue.extend({
|
||||
top 0
|
||||
bottom 0
|
||||
right 20px
|
||||
|
||||
> *
|
||||
height 100%
|
||||
height 100%
|
||||
|
||||
</style>
|
||||
|
@@ -5,7 +5,7 @@
|
||||
<mk-user-card v-for="user in users" :key="user.id" :user="user"/>
|
||||
</div>
|
||||
<p class="empty" v-if="!fetching && users.length == 0">{{ $t('empty') }}</p>
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('fetching') }}<mk-ellipsis/></p>
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('fetching') }}<mk-ellipsis/></p>
|
||||
<a class="refresh" @click="refresh">{{ $t('refresh') }}</a>
|
||||
<button class="close" @click="close" :title="$t('title')"><fa icon="times"/></button>
|
||||
</div>
|
||||
|
@@ -18,7 +18,6 @@ import usersList from './users-list.vue';
|
||||
import userPreview from './user-preview.vue';
|
||||
import userTimeline from './user-timeline.vue';
|
||||
import userListTimeline from './user-list-timeline.vue';
|
||||
import activity from './activity.vue';
|
||||
import widgetContainer from './widget-container.vue';
|
||||
import postForm from './post-form.vue';
|
||||
|
||||
@@ -40,6 +39,5 @@ Vue.component('mk-users-list', usersList);
|
||||
Vue.component('mk-user-preview', userPreview);
|
||||
Vue.component('mk-user-timeline', userTimeline);
|
||||
Vue.component('mk-user-list-timeline', userListTimeline);
|
||||
Vue.component('mk-activity', activity);
|
||||
Vue.component('mk-widget-container', widgetContainer);
|
||||
Vue.component('mk-post-form', postForm);
|
||||
|
@@ -7,7 +7,7 @@
|
||||
:disabled="conversationFetching"
|
||||
>
|
||||
<template v-if="!conversationFetching"><fa icon="ellipsis-v"/></template>
|
||||
<template v-if="conversationFetching"><fa icon="spinner .pulse"/></template>
|
||||
<template v-if="conversationFetching"><fa icon="spinner" pulse/></template>
|
||||
</button>
|
||||
<div class="conversation">
|
||||
<x-sub v-for="note in conversation" :key="note.id" :note="note"/>
|
||||
|
@@ -26,7 +26,7 @@
|
||||
<footer v-if="more">
|
||||
<button @click="loadMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }">
|
||||
<template v-if="!moreFetching">{{ $t('@.load-more') }}</template>
|
||||
<template v-if="moreFetching"><fa icon="spinner .pulse" fixed-width/></template>
|
||||
<template v-if="moreFetching"><fa icon="spinner" pulse fixed-width/></template>
|
||||
</button>
|
||||
</footer>
|
||||
</div>
|
||||
|
@@ -18,7 +18,7 @@
|
||||
</component>
|
||||
|
||||
<button class="more" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications">
|
||||
<template v-if="fetchingMoreNotifications"><fa icon="spinner .pulse" fixed-width/></template>
|
||||
<template v-if="fetchingMoreNotifications"><fa icon="spinner" pulse fixed-width/></template>
|
||||
{{ fetchingMoreNotifications ? $t('@.loading') : $t('@.load-more') }}
|
||||
</button>
|
||||
|
||||
|
@@ -32,7 +32,7 @@
|
||||
<button class="drive" @click="chooseFileFromDrive"><fa icon="cloud"/></button>
|
||||
<button class="kao" @click="kao"><fa :icon="['far', 'smile']"/></button>
|
||||
<button class="poll" @click="poll = true"><fa icon="chart-pie"/></button>
|
||||
<button class="poll" @click="useCw = !useCw"><fa icon="eye-slash"/></button>
|
||||
<button class="poll" @click="useCw = !useCw"><fa :icon="['far', 'eye-slash']"/></button>
|
||||
<button class="geo" @click="geo ? removeGeo() : setGeo()"><fa icon="map-marker-alt"/></button>
|
||||
<button class="visibility" @click="setVisibility" ref="visibilityButton">
|
||||
<span v-if="visibility === 'public'"><fa icon="globe"/></span>
|
||||
|
@@ -14,7 +14,7 @@
|
||||
<p class="no" v-if="!fetching && users.length == 0">
|
||||
<slot></slot>
|
||||
</p>
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
@@ -5,12 +5,12 @@
|
||||
<div class="signin-as" v-html="this.$t('signed-in-as').replace('{}', `<b>${name}</b>`)"></div>
|
||||
|
||||
<div>
|
||||
<mk-profile-editor/>
|
||||
<x-profile-editor/>
|
||||
|
||||
<ui-card>
|
||||
<div slot="title"><fa icon="palette"/> {{ $t('theme') }}</div>
|
||||
<section>
|
||||
<mk-theme/>
|
||||
<x-theme/>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
@@ -85,9 +85,9 @@
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
<mk-drive-settings/>
|
||||
<x-drive-settings/>
|
||||
|
||||
<mk-mute-and-block/>
|
||||
<x-mute-and-block/>
|
||||
|
||||
<ui-card>
|
||||
<div slot="title"><fa icon="volume-up"/> {{ $t('sound') }}</div>
|
||||
@@ -140,12 +140,12 @@
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
<mk-api-settings />
|
||||
<x-api-settings />
|
||||
|
||||
<ui-card>
|
||||
<div slot="title"><fa icon="unlock-alt"/> {{ $t('password') }}</div>
|
||||
<section>
|
||||
<mk-password-settings/>
|
||||
<x-password-settings/>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
@@ -182,6 +182,16 @@ import checkForUpdate from '../../../common/scripts/check-for-update';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('mobile/views/pages/settings.vue'),
|
||||
|
||||
components: {
|
||||
XTheme: () => import('../../../common/views/components/theme.vue').then(m => m.default),
|
||||
XDriveSettings: () => import('../../../common/views/components/drive-settings.vue').then(m => m.default),
|
||||
XMuteAndBlock: () => import('../../../common/views/components/mute-and-block.vue').then(m => m.default),
|
||||
XPasswordSettings: () => import('../../../common/views/components/password-settings.vue').then(m => m.default),
|
||||
XProfileEditor: () => import('../../../common/views/components/profile-editor.vue').then(m => m.default),
|
||||
XApiSettings: () => import('../../../common/views/components/api-settings.vue').then(m => m.default),
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
apiUrl,
|
||||
|
@@ -116,7 +116,7 @@ export default Vue.extend({
|
||||
|
||||
menu() {
|
||||
let menu = [{
|
||||
icon: this.user.isMuted ? '<fa icon="eye"/>' : '<fa icon="eye-slash"/>',
|
||||
icon: this.user.isMuted ? ['fas', 'eye'] : ['far', 'eye-slash'],
|
||||
text: this.user.isMuted ? this.$t('unmute') : this.$t('mute'),
|
||||
action: () => {
|
||||
if (this.user.isMuted) {
|
||||
@@ -138,7 +138,7 @@ export default Vue.extend({
|
||||
}
|
||||
}
|
||||
}, {
|
||||
icon: this.user.isBlocking ? '<fa icon="user"/>' : '<fa icon="user-slash"/>',
|
||||
icon: this.user.isBlocking ? ['fas', 'user'] : ['fas', 'user-slash'],
|
||||
text: this.user.isBlocking ? this.$t('unblock') : this.$t('block'),
|
||||
action: () => {
|
||||
if (this.user.isBlocking) {
|
||||
|
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="root followers-you-know">
|
||||
<p class="initializing" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<p class="initializing" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<div v-if="!fetching && users.length > 0">
|
||||
<a v-for="user in users" :key="user.id" :href="user | userPage">
|
||||
<img :src="user.avatarUrl" :alt="user | userName"/>
|
||||
|
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="root friends">
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<div v-if="!fetching && users.length > 0">
|
||||
<mk-user-card v-for="user in users" :key="user.id" :user="user"/>
|
||||
</div>
|
||||
|
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="root notes">
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<div v-if="!fetching && notes.length > 0">
|
||||
<mk-note-card v-for="note in notes" :key="note.id" :note="note"/>
|
||||
</div>
|
||||
|
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="root photos">
|
||||
<p class="initializing" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<p class="initializing" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<div class="stream" v-if="!fetching && images.length > 0">
|
||||
<a v-for="image in images"
|
||||
class="img"
|
||||
|
@@ -16,7 +16,7 @@
|
||||
<section class="activity">
|
||||
<h2><fa icon="chart-bar"/>{{ $t('activity') }}</h2>
|
||||
<div>
|
||||
<mk-activity :user="user"/>
|
||||
<x-activity :user="user"/>
|
||||
</div>
|
||||
</section>
|
||||
<section class="frequently-replied-users">
|
||||
@@ -49,7 +49,8 @@ export default Vue.extend({
|
||||
XNotes,
|
||||
XPhotos,
|
||||
XFriends,
|
||||
XFollowersYouKnow
|
||||
XFollowersYouKnow,
|
||||
XActivity: () => import('../../components/activity.vue').then(m => m.default)
|
||||
},
|
||||
props: ['user']
|
||||
});
|
||||
|
@@ -3,7 +3,7 @@
|
||||
<mk-widget-container :show-header="!props.compact">
|
||||
<template slot="header"><fa icon="chart-bar"/>{{ $t('activity') }}</template>
|
||||
<div :class="$style.body">
|
||||
<mk-activity :user="$store.state.i"/>
|
||||
<x-activity :user="$store.state.i"/>
|
||||
</div>
|
||||
</mk-widget-container>
|
||||
</div>
|
||||
@@ -20,6 +20,9 @@ export default define({
|
||||
})
|
||||
}).extend({
|
||||
i18n: i18n(),
|
||||
components: {
|
||||
XActivity: () => import('../components/activity.vue').then(m => m.default)
|
||||
},
|
||||
methods: {
|
||||
func() {
|
||||
this.props.compact = !this.props.compact;
|
||||
|
@@ -56,7 +56,7 @@ export default (endpoint: string, user: IUser, app: IApp, data: any, file?: any)
|
||||
console.warn(`SLOW API CALL DETECTED: ${ep.name} (${time}ms)`);
|
||||
}
|
||||
} catch (e) {
|
||||
if (e.name == 'INVALID_PARAM') {
|
||||
if (e && e.name == 'INVALID_PARAM') {
|
||||
rej({
|
||||
code: e.name,
|
||||
param: e.param,
|
||||
|
@@ -216,7 +216,7 @@ export default define(meta, (ps, user, app) => new Promise(async (res, rej) => {
|
||||
}
|
||||
|
||||
// 投稿を作成
|
||||
const note = await create(user, {
|
||||
create(user, {
|
||||
createdAt: new Date(),
|
||||
files: files,
|
||||
poll: ps.poll,
|
||||
@@ -229,12 +229,14 @@ export default define(meta, (ps, user, app) => new Promise(async (res, rej) => {
|
||||
visibility: ps.visibility,
|
||||
visibleUsers,
|
||||
geo: ps.geo
|
||||
});
|
||||
|
||||
const noteObj = await pack(note, user);
|
||||
|
||||
// Reponse
|
||||
res({
|
||||
createdNote: noteObj
|
||||
})
|
||||
.then(note => pack(note, user))
|
||||
.then(noteObj => {
|
||||
res({
|
||||
createdNote: noteObj
|
||||
});
|
||||
})
|
||||
.catch(e => {
|
||||
rej(e);
|
||||
});
|
||||
}));
|
||||
|
@@ -116,27 +116,27 @@ export default async (user: IUser, data: Option, silent = false) => new Promise<
|
||||
|
||||
// リプライ対象が削除された投稿だったらreject
|
||||
if (data.reply && data.reply.deletedAt != null) {
|
||||
return rej();
|
||||
return rej('Reply target has been deleted');
|
||||
}
|
||||
|
||||
// Renote対象が削除された投稿だったらreject
|
||||
if (data.renote && data.renote.deletedAt != null) {
|
||||
return rej();
|
||||
return rej('Renote target has been deleted');
|
||||
}
|
||||
|
||||
// Renote対象が「ホームまたは全体」以外の公開範囲ならreject
|
||||
if (data.renote && data.renote.visibility != 'public' && data.renote.visibility != 'home') {
|
||||
return rej();
|
||||
return rej('Renote target is not public or home');
|
||||
}
|
||||
|
||||
// リプライ対象が自分以外の非公開の投稿なら禁止
|
||||
if (data.reply && data.reply.visibility == 'private' && !data.reply.userId.equals(user._id)) {
|
||||
return rej();
|
||||
return rej('Reply target is private of others');
|
||||
}
|
||||
|
||||
// Renote対象が自分以外の非公開の投稿なら禁止
|
||||
if (data.renote && data.renote.visibility == 'private' && !data.renote.userId.equals(user._id)) {
|
||||
return rej();
|
||||
return rej('Renote target is private of others');
|
||||
}
|
||||
|
||||
if (data.text) {
|
||||
|
@@ -9,6 +9,7 @@ const { VueLoaderPlugin } = require('vue-loader');
|
||||
const WebpackOnBuildPlugin = require('on-build-webpack');
|
||||
//const HardSourceWebpackPlugin = require('hard-source-webpack-plugin');
|
||||
const ProgressBarPlugin = require('progress-bar-webpack-plugin');
|
||||
const TerserPlugin = require('terser-webpack-plugin');
|
||||
|
||||
const constants = require('./src/const.json');
|
||||
|
||||
@@ -146,6 +147,9 @@ module.exports = {
|
||||
resolveLoader: {
|
||||
modules: ['node_modules']
|
||||
},
|
||||
optimization: {
|
||||
minimizer: [new TerserPlugin()]
|
||||
},
|
||||
cache: true,
|
||||
devtool: false, //'source-map',
|
||||
mode: isProduction ? 'production' : 'development'
|
||||
|
Reference in New Issue
Block a user