summaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2024-01-07 14:21:19 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2024-01-07 14:21:19 +0900
commit1d1780081ee85ecc040e05a4ba18a4aa368c1490 (patch)
treef7762c00049dde29e2c53d47dc62fd638d59fb33 /packages
parentFix: `Mk:C:mfm`の`onClickEv`が正常に呼び出されない問題を修正... (diff)
downloadmisskey-1d1780081ee85ecc040e05a4ba18a4aa368c1490.tar.gz
misskey-1d1780081ee85ecc040e05a4ba18a4aa368c1490.tar.bz2
misskey-1d1780081ee85ecc040e05a4ba18a4aa368c1490.zip
enhance(frontend): ゲームのシェア機能
Diffstat (limited to 'packages')
-rw-r--r--packages/frontend/src/pages/drop-and-fusion.vue44
1 files changed, 44 insertions, 0 deletions
diff --git a/packages/frontend/src/pages/drop-and-fusion.vue b/packages/frontend/src/pages/drop-and-fusion.vue
index 7f41be4c58..71d3f06192 100644
--- a/packages/frontend/src/pages/drop-and-fusion.vue
+++ b/packages/frontend/src/pages/drop-and-fusion.vue
@@ -74,6 +74,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<div v-if="gameOver" :class="$style.gameOverLabel">
<div>GAME OVER!</div>
<div>SCORE: <MkNumber :value="score"/></div>
+ <MkButton primary rounded inline @click="share">Share</MkButton>
</div>
</div>
</div>
@@ -103,6 +104,7 @@ SPDX-License-Identifier: AGPL-3.0-only
import * as Matter from 'matter-js';
import { Ref, onMounted, ref, shallowRef } from 'vue';
import { EventEmitter } from 'eventemitter3';
+import * as Misskey from 'misskey-js';
import { definePageMetadata } from '@/scripts/page-metadata.js';
import * as sound from '@/scripts/sound.js';
import MkRippleEffect from '@/components/MkRippleEffect.vue';
@@ -115,6 +117,8 @@ import { misskeyApi } from '@/scripts/misskey-api.js';
import { i18n } from '@/i18n.js';
import { useInterval } from '@/scripts/use-interval.js';
import MkSelect from '@/components/MkSelect.vue';
+import { apiUrl } from '@/config.js';
+import { $i } from '@/account.js';
type Mono = {
id: string;
@@ -788,6 +792,46 @@ async function start() {
game.start();
}
+function getGameImageDriveFile() {
+ return new Promise<Misskey.entities.DriveFile | null>(res => {
+ canvasEl.value?.toBlob(blob => {
+ if (!blob) return res(null);
+ if ($i == null) return res(null);
+ const formData = new FormData();
+ formData.append('file', blob);
+ formData.append('name', `bubble-game-${Date.now()}.png`);
+ formData.append('isSensitive', 'false');
+ formData.append('comment', 'null');
+ formData.append('i', $i.token);
+ if (defaultStore.state.uploadFolder) {
+ formData.append('folderId', defaultStore.state.uploadFolder);
+ }
+
+ window.fetch(apiUrl + '/drive/files/create', {
+ method: 'POST',
+ body: formData,
+ })
+ .then(response => response.json())
+ .then(f => {
+ res(f);
+ });
+ }, 'image/png');
+ });
+}
+
+async function share() {
+ const uploading = getGameImageDriveFile();
+ os.promiseDialog(uploading);
+ const file = await uploading;
+ if (!file) return;
+ os.post({
+ initialText: `#BubbleGame
+MODE: ${gameMode.value}
+SCORE: ${score.value}`,
+ initialFiles: [file],
+ });
+}
+
useInterval(() => {
if (!canvasEl.value) return;
const actualCanvasWidth = canvasEl.value.getBoundingClientRect().width;