From 9201eb151b6a31ad02f3d172436e8d8bb74e98f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?KMY=EF=BC=88=E9=9B=AA=E3=81=82=E3=81=99=E3=81=8B=EF=BC=89?= Date: Mon, 9 Dec 2024 12:12:15 +0900 Subject: [PATCH] =?UTF-8?q?Add:=20#920=20=E3=82=A2=E3=83=B3=E3=83=86?= =?UTF-8?q?=E3=83=8A=E3=83=BB=E3=83=AA=E3=82=B9=E3=83=88=E3=81=AB=E3=80=8C?= =?UTF-8?q?=E3=81=8A=E6=B0=97=E3=81=AB=E5=85=A5=E3=82=8A=E3=81=AB=E7=99=BB?= =?UTF-8?q?=E9=8C=B2=E3=80=8D=E8=A8=AD=E5=AE=9A=20(#946)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add: #920 アンテナ・リストに「お気に入りに登録」設定 * Fix test * Fix test * Add fedibird capabilities * Add kmyblue_favourite_antenna --- app/controllers/api/v1/antennas_controller.rb | 2 +- app/controllers/api/v1/lists_controller.rb | 12 +- app/helpers/kmyblue_capabilities_helper.rb | 2 + app/javascript/mastodon/api_types/antennas.ts | 1 + app/javascript/mastodon/api_types/lists.ts | 1 + .../mastodon/features/antennas/new.tsx | 42 +++++++ .../mastodon/features/lists/new.tsx | 51 ++++++++- .../features/ui/components/list_panel.jsx | 4 +- app/javascript/mastodon/locales/en.json | 4 + app/javascript/mastodon/locales/ja.json | 4 + app/javascript/mastodon/models/antenna.ts | 1 + app/javascript/mastodon/models/list.ts | 1 + app/models/antenna.rb | 27 ++--- app/models/list.rb | 17 ++- app/serializers/rest/antenna_serializer.rb | 2 +- app/serializers/rest/list_serializer.rb | 2 +- config/routes/api.rb | 5 + ...829_add_favourite_to_lists_and_antennas.rb | 17 +++ db/schema.rb | 4 +- lib/tasks/dangerous.rake | 2 + spec/requests/api/v1/antennas_spec.rb | 15 ++- spec/requests/api/v1/lists_spec.rb | 107 +++++++++++++++++- 22 files changed, 294 insertions(+), 29 deletions(-) create mode 100644 db/migrate/20241208232829_add_favourite_to_lists_and_antennas.rb diff --git a/app/controllers/api/v1/antennas_controller.rb b/app/controllers/api/v1/antennas_controller.rb index 37bfb7f552..11610e42c4 100644 --- a/app/controllers/api/v1/antennas_controller.rb +++ b/app/controllers/api/v1/antennas_controller.rb @@ -42,6 +42,6 @@ class Api::V1::AntennasController < Api::BaseController end def antenna_params - params.permit(:title, :list_id, :insert_feeds, :stl, :ltl, :with_media_only, :ignore_reblog) + params.permit(:title, :list_id, :insert_feeds, :stl, :ltl, :with_media_only, :ignore_reblog, :favourite) end end diff --git a/app/controllers/api/v1/lists_controller.rb b/app/controllers/api/v1/lists_controller.rb index 0bacd7fdb0..2086bf116d 100644 --- a/app/controllers/api/v1/lists_controller.rb +++ b/app/controllers/api/v1/lists_controller.rb @@ -38,6 +38,16 @@ class Api::V1::ListsController < Api::BaseController render_empty end + def favourite + @list.favourite! + render json: @list, serializer: REST::ListSerializer + end + + def unfavourite + @list.unfavourite! + render json: @list, serializer: REST::ListSerializer + end + private def set_list @@ -45,6 +55,6 @@ class Api::V1::ListsController < Api::BaseController end def list_params - params.permit(:title, :replies_policy, :exclusive, :notify) + params.permit(:title, :replies_policy, :exclusive, :notify, :favourite) end end diff --git a/app/helpers/kmyblue_capabilities_helper.rb b/app/helpers/kmyblue_capabilities_helper.rb index 075869ee60..279505bec8 100644 --- a/app/helpers/kmyblue_capabilities_helper.rb +++ b/app/helpers/kmyblue_capabilities_helper.rb @@ -20,6 +20,8 @@ module KmyblueCapabilitiesHelper kmyblue_circle_history kmyblue_list_notification kmyblue_server_features + favourite_list + kmyblue_favourite_antenna ) capabilities << :full_text_search if Chewy.enabled? diff --git a/app/javascript/mastodon/api_types/antennas.ts b/app/javascript/mastodon/api_types/antennas.ts index 75a8835276..a2a8a997ba 100644 --- a/app/javascript/mastodon/api_types/antennas.ts +++ b/app/javascript/mastodon/api_types/antennas.ts @@ -10,6 +10,7 @@ export interface ApiAntennaJSON { insert_feeds: boolean; with_media_only: boolean; ignore_reblog: boolean; + favourite: boolean; list: ApiListJSON | null; list_id: string | undefined; diff --git a/app/javascript/mastodon/api_types/lists.ts b/app/javascript/mastodon/api_types/lists.ts index d7a8247bbe..bc32b33883 100644 --- a/app/javascript/mastodon/api_types/lists.ts +++ b/app/javascript/mastodon/api_types/lists.ts @@ -10,5 +10,6 @@ export interface ApiListJSON { exclusive: boolean; replies_policy: RepliesPolicyType; notify: boolean; + favourite: boolean; antennas?: ApiAntennaJSON[]; } diff --git a/app/javascript/mastodon/features/antennas/new.tsx b/app/javascript/mastodon/features/antennas/new.tsx index 0936768c14..9a1fa0188d 100644 --- a/app/javascript/mastodon/features/antennas/new.tsx +++ b/app/javascript/mastodon/features/antennas/new.tsx @@ -62,6 +62,7 @@ const NewAntenna: React.FC<{ const [ignoreReblog, setIgnoreReblog] = useState(false); const [mode, setMode] = useState('filtering'); const [destination, setDestination] = useState('timeline'); + const [favourite, setFavourite] = useState(true); const [submitting, setSubmitting] = useState(false); useEffect(() => { @@ -80,6 +81,7 @@ const NewAntenna: React.FC<{ setListId(antenna.list?.id ?? '0'); setWithMediaOnly(antenna.with_media_only); setIgnoreReblog(antenna.ignore_reblog); + setFavourite(antenna.favourite); if (antenna.stl) { setMode('stl'); @@ -109,6 +111,7 @@ const NewAntenna: React.FC<{ setIgnoreReblog, setMode, setDestination, + setFavourite, id, antenna, lists, @@ -179,6 +182,13 @@ const NewAntenna: React.FC<{ [setIgnoreReblog], ); + const handleFavouriteChange = useCallback( + ({ target: { checked } }: React.ChangeEvent) => { + setFavourite(checked); + }, + [setFavourite], + ); + const handleSubmit = useCallback(() => { setSubmitting(true); @@ -193,6 +203,7 @@ const NewAntenna: React.FC<{ list_id: destination === 'list' ? listId : '0', with_media_only: withMediaOnly, ignore_reblog: ignoreReblog, + favourite, }), ).then(() => { setSubmitting(false); @@ -208,6 +219,7 @@ const NewAntenna: React.FC<{ list_id: destination === 'list' ? listId : '0', with_media_only: withMediaOnly, ignore_reblog: ignoreReblog, + favourite, }), ).then((result) => { setSubmitting(false); @@ -233,6 +245,7 @@ const NewAntenna: React.FC<{ withMediaOnly, ignoreReblog, destination, + favourite, ]); return ( @@ -460,6 +473,35 @@ const NewAntenna: React.FC<{ )} +
+ {/* eslint-disable-next-line jsx-a11y/label-has-associated-control */} + +
+
+
+ {/* eslint-disable-next-line jsx-a11y/label-has-associated-control */} + +
+