Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(frontend): ノート・ユーザータイムライン埋め込み #13929

Merged
merged 349 commits into from
Sep 9, 2024

Conversation

kakkokari-gtyih
Copy link
Contributor

@kakkokari-gtyih kakkokari-gtyih commented Jun 1, 2024

What

  • embed時の起動ロジックの分離
    • アカウントの読み込み回避
    • localStorage, indexedDBをセッションごとに初期化 (safeSessionStorage)
      • 必要なデータは本物のlocalStorageからコピーするように
    • os.popupを回避
      • 代替アクションの実装
    • routerが遷移してしまうのを回避
  • postMessageの改良
    • ウィンドウリサイズ機構の実装
    • iframeIdを保持する機構の実装
    • iframeIdを一度設定したら変更できないように
    • parent iframeにメッセージが行かない問題を修正
  • 各種埋め込みコンポーネントの作成
    • 個別ノート
    • ユーザーTL
    • クリップのノート一覧
    • ハッシュタグのノート一覧
  • 埋め込みコード生成機構の作成
  • WebSocketを使わないようにする(Related to No WebSocketモード #12227

Why

Fix #1714
Close #10491

Additional info (optional)

カスタマイズ用 パラメータ

共通

  • colorMode: light | dark | auto。カラーモードのオーバーライド。デフォルト: auto
  • rounded: true | false。角丸にするかどうか。デフォルト: true
  • border: true | false。外周のボーダーをつけるかどうか。デフォルト: true

TL系

  • header: true | false。上部にヘッダを設けるかどうか。デフォルト: true
  • autoload: true | false。無限スクロールするかどうか。デフォルト: false
  • maxHeight: 数値。設定すると、指定した高さ以降はスクロールバーが出る。指定しない場合はどこまでも伸びる(デフォルトで何らかの値を設定した状態のコードを生成する)

埋め込みコード

たぶんミニファイして2行になると思う

<iframe src="http://localhost:5173/embed/notes/9qhdxot24f?" data-misskey-embed-id="v1_8482df8f-5f43-49f4-9c18-f2c6b013f9ba" style="border: none; width: 100%; max-width: 500px; height: 300px; color-scheme: light dark;"></iframe>
<script defer src="http://localhost:5173/embed.js"></script>

その他

/packages/backend/assets/embed.js (親ページ側から読み込むiframe制御用スクリプト)はいろいろ使いまわしやすいようにSPDXをMITライセンスとしている

Checklist

  • Read the contribution guide
  • Test working in a local environment
  • (If needed) Add story of storybook
  • (If needed) Update CHANGELOG.md
  • (If possible) Add tests

@github-actions github-actions bot added packages/frontend Client side specific issue/PR packages/backend Server side specific issue/PR labels Jun 1, 2024
Copy link
Contributor

github-actions bot commented Jun 1, 2024

このPRによるapi.jsonの差分

差分はこちら

Get diff files from Workflow Page

Copy link

codecov bot commented Jun 1, 2024

Codecov Report

Attention: Patch coverage is 17.38241% with 808 lines in your changes missing coverage. Please review.

Project coverage is 41.27%. Comparing base (0d0cd73) to head (21e23c0).
Report is 1 commits behind head on develop.

Files with missing lines Patch % Lines
...s/frontend/src/components/MkEmbedCodeGenDialog.vue 0.00% 411 Missing and 1 partial ⚠️
packages/frontend/src/scripts/stream-mock.ts 0.00% 80 Missing and 1 partial ⚠️
packages/frontend/src/scripts/get-embed-code.ts 36.78% 55 Missing ⚠️
...ages/backend/src/server/web/ClientServerService.ts 4.87% 39 Missing ⚠️
packages/frontend/src/pages/clip.vue 0.00% 26 Missing ⚠️
packages/frontend/src/router/main.ts 28.57% 20 Missing ⚠️
packages/frontend/src/scripts/get-note-menu.ts 11.11% 16 Missing ⚠️
packages/frontend/src/pages/tag.vue 0.00% 14 Missing ⚠️
packages/frontend/src/boot/main-boot.ts 0.00% 13 Missing ⚠️
packages/frontend/src/scripts/is-link.ts 0.00% 11 Missing and 1 partial ⚠️
... and 56 more
Additional details and impacted files
@@             Coverage Diff             @@
##           develop   #13929      +/-   ##
===========================================
- Coverage    41.46%   41.27%   -0.19%     
===========================================
  Files         1551     1543       -8     
  Lines       196719   196679      -40     
  Branches      3618     3549      -69     
===========================================
- Hits         81564    81181     -383     
- Misses      114591   114902     +311     
- Partials       564      596      +32     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@kakkokari-gtyih kakkokari-gtyih changed the title feat(frontend): ノート・ユーザータイムライン・ローカルタイムライン埋め込み feat(frontend): ノート・ユーザータイムライン埋め込み Jun 1, 2024
@syuilo
Copy link
Member

syuilo commented Jun 2, 2024

/preview

@syuilo
Copy link
Member

syuilo commented Jun 2, 2024

特定の操作でログインダイアログ出せるわね
image

@syuilo
Copy link
Member

syuilo commented Jun 2, 2024

考えられる対応

  • embedではページ遷移禁止
  • embedではログインAPI叩くの禁止

@syuilo
Copy link
Member

syuilo commented Jun 2, 2024

ページ遷移は必ず新しいタブ の方が良いわね

@syuilo
Copy link
Member

syuilo commented Jun 2, 2024

特定の操作でログインダイアログ出せるわね image

  • 時間クリックして投稿詳細に遷移する手法
  • アバタークリックしてユーザーページに遷移する手法
  • 名前クリックしてユーザーページに遷移する手法

@syuilo
Copy link
Member

syuilo commented Jun 2, 2024

あと何らかの原因で「読み込みに失敗しました」ページが表示されてしまうとそこからいろいろアクセスできてしまいそう

@syuilo
Copy link
Member

syuilo commented Jun 2, 2024

やっぱり場合によってはこの画面を出すことが可能であることを確認
image

@syuilo
Copy link
Member

syuilo commented Jun 2, 2024

あとWebSocketに繋ぐのは無駄そう

@kakkokari-gtyih
Copy link
Contributor Author

あとWebSocketに繋ぐのは無駄そう

将来的にLTL埋め込みとかが入ると使うかもしれない(ただし通常の埋め込みに必要ないのは事実なのでBootOptionsで切れるようにするのがよさそう

@syuilo
Copy link
Member

syuilo commented Jun 2, 2024

LTL埋め込む場合でもポーリングで事足りそう

@kakkokari-gtyih
Copy link
Contributor Author

ページ遷移は必ず新しいタブ の方が良いわね

navHookで全部別窓に飛ばすようにした

@kakkokari-gtyih
Copy link
Contributor Author

kakkokari-gtyih commented Jun 2, 2024

やっぱり場合によってはこの画面を出すことが可能であることを確認

これってどこ由来の画面だっけ

@syuilo
Copy link
Member

syuilo commented Jun 2, 2024

boot.js

@kakkokari-gtyih
Copy link
Contributor Author

boot.js

embed画面では追加CSS読み込んで単に非表示にするだけでよさそう?(boot.jsをいじるとめんどくさそうなので)

@kakkokari-gtyih
Copy link
Contributor Author

kakkokari-gtyih commented Jun 3, 2024

WebSocketを無効にするのが難しそう

@kakkokari-gtyih
Copy link
Contributor Author

boot.js

embed画面では追加CSS読み込んで単に非表示にするだけでよさそう?(boot.jsをいじるとめんどくさそうなので)

そうした

@kakkokari-gtyih
Copy link
Contributor Author

kakkokari-gtyih commented Jun 3, 2024

image

右上にサーバーアイコン出すやつやりたいけど構造的にしんどそう(MkNoteSubとかがあると余計)

@kakkokari-gtyih
Copy link
Contributor Author

kakkokari-gtyih commented Jun 3, 2024

右上にサーバーアイコン出すやつやりたいけど構造的にしんどそう

MkNoteDetailedをこねこねしてなんとかした

image

@kakkokari-gtyih
Copy link
Contributor Author

image

@kakkokari-gtyih
Copy link
Contributor Author

kakkokari-gtyih commented Jun 3, 2024

埋め込みコードジェネレーターのフロントエンド側実装のうち詳細設定(パラメータをGUIで設定してプレビューするやつ)の部分については最悪Misskey Hubにドキュメント置いておくのでもいいかもしれない

あとWebSocketに繋ぐのは無駄そう

No Websocket モード #12227 については私では生半可にいじるとまずいかもしれないので @syuilo さんとかにやっていただきたい気持ち

@kakkokari-gtyih

This comment was marked as resolved.

@kakkokari-gtyih
Copy link
Contributor Author

kakkokari-gtyih commented Jun 6, 2024

埋め込みコードの仕様が変わったときのことを考えてサーバーからサイズ調整用JSを配信するのが良いのかなと思ったりした
Mastodonはそうやってるっぽい

<iframe src="https://mastodon.social/@superdiey/112568890847967947/embed" class="mastodon-embed" style="max-width: 100%; border: 0" width="400" allowfullscreen="allowfullscreen"></iframe>
<script src="https://mastodon.social/embed.js" async="async"></script>

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

embed-bootを作った方が良さそう

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

embed_boot.tsを作ってエントリーポイントごと分けるということ?それともsub-bootとかの並列で処理を分けたほうがいいということ?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

前者だわね

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

This comment was marked as resolved.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

エントリーポイント分けたらサーバーサイドdevモードでHMRが効かなくなった

キャッシュ消したらいけた

@kakkokari-gtyih
Copy link
Contributor Author

kakkokari-gtyih commented Jun 7, 2024

だいたいできてきたのでここいらでまわりの人の意見を聞きたい

現時点での懸案事項

① iframeサイズ調整用のscriptをどうするか
将来的にiframe埋め込み時の通信の構造を変更するかもしれないことを考えると、制御用コードを直で置くのではなく、サーバーから親ページ用のコードを読み込ませる方式のほうが良いんじゃないかとも思っている(詳細→ #13929 (comment)

② websocketを切る
(やろうとしたけど結構根が深そうだった+別件でNo Websocketモードが提案されていた)ので @syuilo さんあたりにちゃんとやってもらいたい気持ち

③ 他の埋め込みウィジェット
募集中

@kakkokari-gtyih
Copy link
Contributor Author

kakkokari-gtyih commented Sep 9, 2024

frontend-embedとfrontend-sharedに対してCIがないかも
(たぶんeslintだけでいいとおもう)

@kakkokari-gtyih
Copy link
Contributor Author

frontend-sharedがそもそもlintできてない・・・

@kakkokari-gtyih
Copy link
Contributor Author

frontend-sharedがそもそもlintできてない・・・

Error while loading rule '@typescript-eslint/no-unnecessary-condition': You have used a rule which requires parserServices to be generated. You must therefore provide a value for the "parserOptions.project" property for @typescript-eslint/parser.

@syuilo
Copy link
Member

syuilo commented Sep 9, 2024

マージするぞ

@kakkokari-gtyih
Copy link
Contributor Author

frontend-sharedがそもそもlintできてない・・・

Error while loading rule '@typescript-eslint/no-unnecessary-condition': You have used a rule which requires parserServices to be generated. You must therefore provide a value for the "parserOptions.project" property for @typescript-eslint/parser.

これなおしたいけど謎

@syuilo
Copy link
Member

syuilo commented Sep 9, 2024

@kakkokari-gtyih
Copy link
Contributor Author

直った可能性がある

@syuilo syuilo merged commit 2cbe1d1 into misskey-dev:develop Sep 9, 2024
34 checks passed
@syuilo
Copy link
Member

syuilo commented Sep 9, 2024

🙏🏻🙏🏻🙏🏻

@syuilo
Copy link
Member

syuilo commented Sep 9, 2024

@kakkokari-gtyih 戻した分のPRを作ってもらうことできるかしら

@kakkokari-gtyih
Copy link
Contributor Author

kakkokari-gtyih commented Sep 9, 2024

@kakkokari-gtyih 戻した分のPRを作ってもらうことできるかしら

ちょっと時間かかるかもしれないけどやっておく

@syuilo
Copy link
Member

syuilo commented Sep 11, 2024

@kakkokari-gtyih 戻した分のPRを作ってもらうことできるかしら

ちょっと時間かかるかもしれないけどやっておく

これもう着手されてるかしら

@kakkokari-gtyih
Copy link
Contributor Author

@kakkokari-gtyih 戻した分のPRを作ってもらうことできるかしら

ちょっと時間かかるかもしれないけどやっておく

これもう着手されてるかしら

まだかも

@kakkokari-gtyih
Copy link
Contributor Author

@kakkokari-gtyih 戻した分のPRを作ってもらうことできるかしら

#14546

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
packages/backend Server side specific issue/PR packages/frontend Client side specific issue/PR packages/misskey-js packages/sw
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Misskeyの投稿埋め込み
9 participants