diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5933a4383c..e4605fe746 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -35,6 +35,7 @@
- Enhance: リプライにて引用がある場合テキストが空でもノートできるように
- 引用したいノートのURLをコピーしリプライ投稿画面にペーストして添付することで達成できます
- Enhance: フォローするかどうかの確認ダイアログを出せるように
+- Enhance: Playを手動でリロードできるように
- Chore: AiScriptを0.18.0にバージョンアップ
- Fix: 一部のページ内リンクが正しく動作しない問題を修正
- Fix: 周年の実績が閏年を考慮しない問題を修正
@@ -50,6 +51,7 @@
- Fix: ノート詳細ページにおいてCW付き引用リノートのCWボタンのラベルに「引用」が含まれていない問題を修正
- Fix: ダイアログの入力で字数制限に違反していてもEnterキーが押せてしまう問題を修正
- Fix: ダイレクト投稿の宛先が保存されない問題を修正
+- Fix: Playのページを離れたときに、Playが正常に初期化されない問題を修正
### Server
- Enhance: エンドポイント`antennas/update`の必須項目を`antennaId`のみに
diff --git a/packages/frontend/src/pages/flash/flash.vue b/packages/frontend/src/pages/flash/flash.vue
index 4aa3ce1672..40499fde0e 100644
--- a/packages/frontend/src/pages/flash/flash.vue
+++ b/packages/frontend/src/pages/flash/flash.vue
@@ -15,11 +15,15 @@ SPDX-License-Identifier: AGPL-3.0-only
-
{{ flash.likedCount }}
-
{{ flash.likedCount }}
-
-
-
+
+
+
+
+ {{ flash.likedCount }}
+ {{ flash.likedCount }}
+
+
+
@@ -49,7 +53,7 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts._play.editThisPage }}
-
+
@@ -94,12 +98,33 @@ function fetchFlash() {
});
}
+function share(ev: MouseEvent) {
+ if (!flash.value) return;
+
+ os.popupMenu([
+ {
+ text: i18n.ts.shareWithNote,
+ icon: 'ti ti-pencil',
+ action: shareWithNote,
+ },
+ ...(isSupportShare() ? [{
+ text: i18n.ts.share,
+ icon: 'ti ti-share',
+ action: shareWithNavigator,
+ }] : []),
+ ], ev.currentTarget ?? ev.target);
+}
+
function copyLink() {
+ if (!flash.value) return;
+
copyToClipboard(`${url}/play/${flash.value.id}`);
os.success();
}
-function share() {
+function shareWithNavigator() {
+ if (!flash.value) return;
+
navigator.share({
title: flash.value.title,
text: flash.value.summary,
@@ -108,21 +133,28 @@ function share() {
}
function shareWithNote() {
+ if (!flash.value) return;
+
os.post({
- initialText: `${flash.value.title} ${url}/play/${flash.value.id}`,
+ initialText: `${flash.value.title}\n${url}/play/${flash.value.id}`,
+ instant: true,
});
}
function like() {
+ if (!flash.value) return;
+
os.apiWithDialog('flash/like', {
flashId: flash.value.id,
}).then(() => {
- flash.value.isLiked = true;
- flash.value.likedCount++;
+ flash.value!.isLiked = true;
+ flash.value!.likedCount++;
});
}
async function unlike() {
+ if (!flash.value) return;
+
const confirm = await os.confirm({
type: 'warning',
text: i18n.ts.unlikeConfirm,
@@ -131,8 +163,8 @@ async function unlike() {
os.apiWithDialog('flash/unlike', {
flashId: flash.value.id,
}).then(() => {
- flash.value.isLiked = false;
- flash.value.likedCount--;
+ flash.value!.isLiked = false;
+ flash.value!.likedCount--;
});
}
@@ -152,6 +184,7 @@ function start() {
async function run() {
if (aiscript.value) aiscript.value.abort();
+ if (!flash.value) return;
aiscript.value = new Interpreter({
...createAiScriptEnv({
@@ -193,12 +226,17 @@ async function run() {
}
}
-onDeactivated(() => {
+function reset() {
if (aiscript.value) aiscript.value.abort();
+ started.value = false;
+}
+
+onDeactivated(() => {
+ reset();
});
onUnmounted(() => {
- if (aiscript.value) aiscript.value.abort();
+ reset();
});
const headerActions = computed(() => []);
@@ -265,11 +303,19 @@ definePageMetadata(() => ({
}
> .actions {
- display: flex;
- justify-content: center;
- gap: 12px;
margin-top: 16px;
- padding: 16px;
+
+ > .items {
+ display: flex;
+ justify-content: center;
+ gap: 12px;
+ padding: 16px;
+ border-bottom: 1px solid var(--divider);
+
+ &:last-child {
+ border-bottom: none;
+ }
+ }
}
}
}