misskey/src/client/app/common/views/components/games/reversi/reversi.vue

176 lines
3.3 KiB
Vue
Raw Normal View History

2018-03-06 16:54:56 +00:00
<template>
2018-08-03 06:59:24 +00:00
<div class="vchtoekanapleubgzioubdtmlkribzfd">
2018-03-07 02:40:40 +00:00
<div v-if="game">
2018-08-05 04:40:26 +00:00
<x-gameroom :game="game" :self-nav="selfNav" @go-index="goIndex"/>
2018-03-07 02:40:40 +00:00
</div>
2018-03-07 08:48:32 +00:00
<div class="matching" v-else-if="matching">
<h1>{{ this.$t('matching.waiting-for').split('{}')[0] }}<b>{{ matching | userName }}</b>{{ this.$t('matching.waiting-for').split('{}')[1] }}<mk-ellipsis/></h1>
2018-03-07 08:48:32 +00:00
<div class="cancel">
<form-button round @click="cancel">{{ $t('matching.cancel') }}</form-button>
2018-03-07 08:48:32 +00:00
</div>
2018-03-06 16:54:56 +00:00
</div>
2018-08-03 16:47:57 +00:00
<div v-else-if="gameId">
2018-08-03 16:03:48 +00:00
...
</div>
2018-03-07 08:48:32 +00:00
<div class="index" v-else>
2018-08-03 13:34:58 +00:00
<x-index @go="nav" @matching="onMatching"/>
2018-03-06 16:54:56 +00:00
</div>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import i18n from '../../../../../i18n';
2018-06-16 23:10:54 +00:00
import XGameroom from './reversi.gameroom.vue';
2018-08-03 12:30:44 +00:00
import XIndex from './reversi.index.vue';
2018-08-03 13:34:58 +00:00
import Progress from '../../../../scripts/loading';
2018-03-07 02:40:40 +00:00
2018-03-06 16:54:56 +00:00
export default Vue.extend({
i18n: i18n('common/views/components/games/reversi/reversi.vue'),
2018-03-07 02:40:40 +00:00
components: {
2018-08-03 12:30:44 +00:00
XGameroom,
XIndex
2018-03-07 02:40:40 +00:00
},
2018-08-03 13:34:58 +00:00
props: {
gameId: {
type: String,
required: false
2018-08-05 04:40:26 +00:00
},
selfNav: {
type: Boolean,
require: false,
default: true
2018-08-03 13:34:58 +00:00
}
},
2018-03-07 02:40:40 +00:00
data() {
return {
game: null,
2018-03-07 08:48:32 +00:00
matching: null,
2018-03-07 02:40:40 +00:00
connection: null,
2018-03-11 09:08:26 +00:00
pingClock: null
2018-03-07 02:40:40 +00:00
};
},
2018-03-09 16:48:16 +00:00
watch: {
2018-08-04 03:35:57 +00:00
game() {
this.$emit('gamed', this.game);
},
2018-08-03 16:03:48 +00:00
gameId() {
this.fetch();
2018-03-09 16:48:16 +00:00
}
},
2018-03-07 02:40:40 +00:00
mounted() {
2018-08-03 16:03:48 +00:00
this.fetch();
if (this.$store.getters.isSignedIn) {
2018-11-08 23:13:34 +00:00
this.connection = this.$root.stream.useSharedConnection('gamesReversi');
2018-03-07 02:40:40 +00:00
this.connection.on('matched', this.onMatched);
this.pingClock = setInterval(() => {
if (this.matching) {
2018-10-09 06:08:31 +00:00
this.connection.send('ping', {
id: this.matching.id
});
}
}, 3000);
}
2018-03-07 02:40:40 +00:00
},
2018-03-07 02:40:40 +00:00
beforeDestroy() {
if (this.connection) {
this.connection.dispose();
clearInterval(this.pingClock);
}
2018-03-07 02:40:40 +00:00
},
2018-03-07 02:40:40 +00:00
methods: {
2018-08-03 16:03:48 +00:00
fetch() {
if (this.gameId == null) {
this.game = null;
} else {
Progress.start();
2018-11-08 23:13:34 +00:00
this.$root.api('games/reversi/games/show', {
2018-08-03 16:03:48 +00:00
gameId: this.gameId
}).then(game => {
2018-08-05 04:40:26 +00:00
this.game = game;
2018-08-03 16:03:48 +00:00
Progress.done();
});
}
},
2018-08-05 04:40:26 +00:00
async nav(game, actualNav = true) {
if (this.selfNav) {
// 受け取ったゲーム情報が省略されたものなら完全な情報を取得する
if (game != null && (game.settings == null || game.settings.map == null)) {
2018-11-08 23:13:34 +00:00
game = await this.$root.api('games/reversi/games/show', {
2018-08-05 04:40:26 +00:00
gameId: game.id
});
}
2018-08-03 13:34:58 +00:00
2018-08-05 04:40:26 +00:00
this.game = game;
} else {
this.$emit('nav', game, actualNav);
2018-08-03 13:34:58 +00:00
}
2018-03-09 09:29:27 +00:00
},
2018-08-03 12:30:44 +00:00
onMatching(user) {
this.matching = user;
2018-03-07 02:40:40 +00:00
},
2018-03-07 08:48:32 +00:00
cancel() {
this.matching = null;
2018-11-08 23:13:34 +00:00
this.$root.api('games/reversi/match/cancel');
2018-03-07 08:48:32 +00:00
},
2018-03-07 08:48:32 +00:00
accept(invitation) {
2018-11-08 23:13:34 +00:00
this.$root.api('games/reversi/match', {
2018-03-29 05:48:47 +00:00
userId: invitation.parent.id
2018-03-07 08:48:32 +00:00
}).then(game => {
if (game) {
2018-03-11 09:08:26 +00:00
this.matching = null;
2018-08-05 04:40:26 +00:00
this.nav(game);
2018-03-07 08:48:32 +00:00
}
});
},
2018-03-07 02:40:40 +00:00
onMatched(game) {
2018-03-11 09:08:26 +00:00
this.matching = null;
2018-03-07 02:40:40 +00:00
this.game = game;
2018-08-05 04:40:26 +00:00
this.nav(game, false);
},
goIndex() {
this.nav(null);
2018-03-06 16:54:56 +00:00
}
}
});
</script>
2018-03-07 08:48:32 +00:00
<style lang="stylus" scoped>
2018-09-28 10:59:19 +00:00
.vchtoekanapleubgzioubdtmlkribzfd
color var(--text)
background var(--bg)
2018-03-07 08:48:32 +00:00
> .matching
> h1
margin 0
padding 24px
font-size 20px
text-align center
font-weight normal
> .cancel
margin 0 auto
padding 24px 0 0 0
max-width 200px
text-align center
border-top dashed 1px #c4cdd4
</style>