diff --git a/.github/workflows/pl-fe.yaml b/.github/workflows/pl-fe.yaml index f0333f583..fad6f0d7b 100644 --- a/.github/workflows/pl-fe.yaml +++ b/.github/workflows/pl-fe.yaml @@ -12,7 +12,7 @@ jobs: name: Test and upload artifacts strategy: matrix: - node-version: [21.x] + node-version: [22.x] steps: - name: Install system dependencies diff --git a/.vscode/extensions.json b/.vscode/extensions.json index d1762aa9a..33be54684 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -4,6 +4,6 @@ "bradlc.vscode-tailwindcss", "stylelint.vscode-stylelint", "wix.vscode-import-cost", - "redhat.vscode-yaml" + "bradlc.vscode-tailwindcss" ] } diff --git a/packages/pl-api/lib/client.ts b/packages/pl-api/lib/client.ts index a1dd33ae9..005934cd9 100644 --- a/packages/pl-api/lib/client.ts +++ b/packages/pl-api/lib/client.ts @@ -256,7 +256,7 @@ interface PlApiClientConstructorOpts { /** * @category Clients - * + * * Mastodon API client. */ class PlApiClient { @@ -2214,11 +2214,8 @@ class PlApiClient { * Requires features{@link Features['statusDislikes']}. * @see {@link https://github.com/friendica/friendica/blob/2024.06-rc/doc/API-Friendica.md#get-apifriendicastatusesiddisliked_by} */ - getDislikedBy: async (statusId: string) => { - const response = await this.request(`/api/friendica/statuses/${statusId}/disliked_by`); - - return v.parse(filteredArray(accountSchema), response.json); - }, + getDislikedBy: async (statusId: string) => + this.#paginatedGet(`/api/v1/statuses/${statusId}/disliked_by`, {}, accountSchema), /** * Marks the given status as disliked by this user diff --git a/packages/pl-api/lib/entities/backup.ts b/packages/pl-api/lib/entities/backup.ts index 8a49f4afa..5a142c07e 100644 --- a/packages/pl-api/lib/entities/backup.ts +++ b/packages/pl-api/lib/entities/backup.ts @@ -8,7 +8,7 @@ import { datetimeSchema, mimeSchema } from './utils'; */ const backupSchema = v.object({ id: v.pipe(v.unknown(), v.transform(String)), - contentType: mimeSchema, + content_type: mimeSchema, file_size: v.fallback(v.number(), 0), inserted_at: datetimeSchema, processed: v.fallback(v.boolean(), false), diff --git a/packages/pl-api/lib/features.ts b/packages/pl-api/lib/features.ts index 7c97b291d..d261f3b18 100644 --- a/packages/pl-api/lib/features.ts +++ b/packages/pl-api/lib/features.ts @@ -257,6 +257,7 @@ const getFeatures = (instance: Instance) => { announcements: any([ v.software === FIREFISH, v.software === ICESHRIMP, + v.software === ICESHRIMP_NET, v.software === MASTODON, v.software === PLEROMA, v.software === TAKAHE && gte(v.version, '0.7.0'), @@ -283,6 +284,7 @@ const getFeatures = (instance: Instance) => { * see POST /api/v1/bite */ bites: any([ + v.software === ICESHRIMP_NET, v.software === TOKI, instance.api_versions['bites.pleroma.pl-api'] >= 1, ]), @@ -309,6 +311,7 @@ const getFeatures = (instance: Instance) => { v.software === FIREFISH, v.software === GOTOSOCIAL, v.software === ICESHRIMP, + v.software === ICESHRIMP_NET, v.software === FRIENDICA, v.software === MASTODON, v.software === MITRA && gte(v.version, '3.3.0'), @@ -325,6 +328,7 @@ const getFeatures = (instance: Instance) => { bots: any([ v.software === GOTOSOCIAL, v.software === ICESHRIMP, + v.software === ICESHRIMP_NET, v.software === MASTODON, v.software === PLEROMA, ]), @@ -359,6 +363,7 @@ const getFeatures = (instance: Instance) => { v.software === FRIENDICA, v.software === GOTOSOCIAL && gte(v.version, '0.17.0'), v.software === ICESHRIMP, + v.software === ICESHRIMP_NET, v.software === MASTODON, v.software === PIXELFED, v.software === PLEROMA, @@ -439,6 +444,7 @@ const getFeatures = (instance: Instance) => { v.software === FRIENDICA, v.software === GOTOSOCIAL, v.software === ICESHRIMP, + v.software === ICESHRIMP_NET, v.software === MASTODON, v.software === MITRA, v.software === PIXELFED, @@ -455,6 +461,7 @@ const getFeatures = (instance: Instance) => { v.software === FIREFISH, v.software === FRIENDICA && gte(v.version, '2022.12.0'), v.software === ICESHRIMP, + v.software === ICESHRIMP_NET, v.software === MASTODON, v.software === MITRA, v.software === TAKAHE && gte(v.version, '0.8.0'), @@ -527,6 +534,7 @@ const getFeatures = (instance: Instance) => { v.software === FRIENDICA, v.software === GOTOSOCIAL, v.software === ICESHRIMP, + v.software === ICESHRIMP_NET, v.software === MASTODON, v.software === TAKAHE && gte(v.version, '0.6.1'), v.software === TOKI, @@ -563,6 +571,7 @@ const getFeatures = (instance: Instance) => { */ filtersV2: any([ v.software === GOTOSOCIAL && gte(v.version, '0.16.0'), + v.software === ICESHRIMP_NET, v.software === MASTODON, ]), @@ -624,6 +633,7 @@ const getFeatures = (instance: Instance) => { */ frontendConfigurations: any([ v.software === DITTO, + v.software === ICESHRIMP_NET, v.software === PLEROMA, ]), @@ -750,6 +760,7 @@ const getFeatures = (instance: Instance) => { v.software === FRIENDICA, v.software === GOTOSOCIAL, v.software === ICESHRIMP, + v.software === ICESHRIMP_NET, v.software === MASTODON, v.software === PLEROMA, ]), @@ -820,6 +831,7 @@ const getFeatures = (instance: Instance) => { mediaV2: any([ v.software === FIREFISH, v.software === ICESHRIMP, + v.software === ICESHRIMP_NET, v.software === MASTODON, v.software === MITRA, v.software === PLEROMA, @@ -850,6 +862,7 @@ const getFeatures = (instance: Instance) => { v.software === FRIENDICA, v.software === GOTOSOCIAL && gte(v.version, '0.16.0'), v.software === ICESHRIMP, + v.software === ICESHRIMP_NET, v.software === MASTODON, v.software === MITRA, v.software === PIXELFED, @@ -865,6 +878,7 @@ const getFeatures = (instance: Instance) => { v.software === FIREFISH, v.software === GOTOSOCIAL && gte(v.version, '0.16.0'), v.software === ICESHRIMP, + v.software === ICESHRIMP_NET, v.software === MASTODON, v.software === PLEROMA, v.software === TAKAHE, @@ -903,6 +917,7 @@ const getFeatures = (instance: Instance) => { notificationsIncludeTypes: any([ v.software === FIREFISH, v.software === ICESHRIMP, + v.software === ICESHRIMP_NET, v.software === MASTODON, v.software === PLEROMA && gte(v.version, '2.5.0'), v.software === TAKAHE && gte(v.version, '0.6.2'), @@ -965,6 +980,7 @@ const getFeatures = (instance: Instance) => { polls: any([ v.software === FIREFISH, v.software === ICESHRIMP, + v.software === ICESHRIMP_NET, v.software === MASTODON, v.software === TAKAHE && gte(v.version, '0.8.0'), v.software === GOTOSOCIAL, @@ -1014,6 +1030,7 @@ const getFeatures = (instance: Instance) => { v.software === DITTO, v.software === GOTOSOCIAL, v.software === ICESHRIMP, + v.software === ICESHRIMP_NET, v.software === MASTODON, v.software === MITRA, v.software === PLEROMA, @@ -1037,6 +1054,7 @@ const getFeatures = (instance: Instance) => { v.software === FRIENDICA, v.software === GOTOSOCIAL, v.software === ICESHRIMP, + v.software === ICESHRIMP_NET, v.software === MASTODON, v.software === PLEROMA, v.software === TAKAHE, @@ -1048,6 +1066,7 @@ const getFeatures = (instance: Instance) => { * @see POST /api/v1/statuses */ quotePosts: any([ + v.software === ICESHRIMP_NET, v.software === FRIENDICA && gte(v.version, '2023.3.0'), v.software === PLEROMA && [REBASED, AKKOMA].includes(v.build!) && gte(v.version, '2.5.0'), instance.api_versions['quote_posting.pleroma.pl-api'] >= 1, @@ -1059,6 +1078,7 @@ const getFeatures = (instance: Instance) => { * @see POST /api/v1/statuses/:id/reblog */ reblogVisibility: any([ + v.software === ICESHRIMP_NET, v.software === MASTODON, v.software === PLEROMA, ]), @@ -1074,6 +1094,7 @@ const getFeatures = (instance: Instance) => { * @see POST /api/v1/accounts/:id/remove_from_followers */ removeFromFollowers: any([ + v.software === ICESHRIMP_NET, v.software === MASTODON, v.software === PLEROMA && gte(v.version, '2.5.0'), v.software === PLEROMA && v.build === AKKOMA, diff --git a/packages/pl-api/package.json b/packages/pl-api/package.json index 61b7cfa3b..7816f8a90 100644 --- a/packages/pl-api/package.json +++ b/packages/pl-api/package.json @@ -1,6 +1,6 @@ { "name": "pl-api", - "version": "1.0.0-rc.1", + "version": "1.0.0-rc.4", "type": "module", "homepage": "https://github.com/mkljczk/pl-fe/tree/develop/packages/pl-api", "repository": { diff --git a/packages/pl-fe/heroku.yml b/packages/pl-fe/heroku.yml deleted file mode 100644 index 8eec25b9c..000000000 --- a/packages/pl-fe/heroku.yml +++ /dev/null @@ -1,3 +0,0 @@ -build: - docker: - web: Dockerfile diff --git a/packages/pl-fe/package.json b/packages/pl-fe/package.json index 3f07f1f6f..565a1171b 100644 --- a/packages/pl-fe/package.json +++ b/packages/pl-fe/package.json @@ -39,29 +39,29 @@ ], "dependencies": { "@emoji-mart/data": "^1.2.1", - "@floating-ui/react": "^0.26.27", + "@floating-ui/react": "^0.26.28", "@fontsource/inter": "^5.1.0", "@fontsource/noto-sans-javanese": "^5.1.0", "@fontsource/roboto-mono": "^5.1.0", "@fontsource/tajawal": "^5.1.0", - "@lexical/clipboard": "^0.20.0", - "@lexical/code": "^0.20.0", - "@lexical/hashtag": "^0.20.0", - "@lexical/link": "^0.20.0", - "@lexical/list": "^0.20.0", - "@lexical/react": "^0.20.0", - "@lexical/rich-text": "^0.20.0", - "@lexical/selection": "^0.20.0", - "@lexical/utils": "^0.20.0", + "@lexical/clipboard": "^0.21.0", + "@lexical/code": "^0.21.0", + "@lexical/hashtag": "^0.21.0", + "@lexical/link": "^0.21.0", + "@lexical/list": "^0.21.0", + "@lexical/react": "^0.21.0", + "@lexical/rich-text": "^0.21.0", + "@lexical/selection": "^0.21.0", + "@lexical/utils": "^0.21.0", "@mkljczk/lexical-remark": "^0.4.0", "@mkljczk/react-hotkeys": "^1.2.2", "@reach/combobox": "^0.18.0", "@reach/rect": "^0.18.0", "@reach/tabs": "^0.18.0", "@reduxjs/toolkit": "^2.0.1", - "@sentry/browser": "^8.33.0", - "@sentry/react": "^8.33.0", - "@tabler/icons": "^3.21.0", + "@sentry/browser": "^8.42.0", + "@sentry/react": "^8.42.0", + "@tabler/icons": "^3.24.0", "@tailwindcss/aspect-ratio": "^0.4.2", "@tailwindcss/forms": "^0.5.9", "@tailwindcss/typography": "^0.5.15", @@ -69,7 +69,7 @@ "@tanstack/react-virtual": "^3.10.9", "@twemoji/svg": "^15.0.0", "@uidotdev/usehooks": "^2.4.1", - "@vitejs/plugin-react": "^4.3.2", + "@vitejs/plugin-react": "^4.3.4", "autoprefixer": "^10.4.20", "blurhash": "^2.0.5", "bowser": "^2.11.0", @@ -86,22 +86,22 @@ "flexsearch": "^0.7.43", "fuzzysort": "^3.1.0", "graphemesplit": "^2.4.4", - "html-react-parser": "^5.1.18", - "immutable": "^5.0.2", + "html-react-parser": "^5.1.19", + "immutable": "^5.0.3", "intersection-observer": "^0.12.2", "intl-messageformat": "^10.5.14", "intl-pluralrules": "^2.0.1", "isomorphic-dompurify": "^2.16.0", "leaflet": "^1.8.0", - "lexical": "^0.20.0", + "lexical": "^0.21.0", "line-awesome": "^1.3.0", "localforage": "^1.10.0", "lodash": "^4.17.21", "mini-css-extract-plugin": "^2.9.1", "multiselect-react-dropdown": "^2.0.25", - "mutative": "^1.0.11", + "mutative": "^1.1.0", "path-browserify": "^1.0.1", - "pl-api": "^1.0.0-rc.1", + "pl-api": "^1.0.0-rc.4", "postcss": "^8.4.47", "process": "^0.11.10", "punycode": "^2.1.1", @@ -114,12 +114,12 @@ "react-error-boundary": "^4.1.2", "react-helmet-async": "^2.0.5", "react-hot-toast": "^2.4.0", - "react-inlinesvg": "^4.0.0", + "react-inlinesvg": "^4.1.5", "react-intl": "^6.7.0", "react-motion": "^0.5.2", "react-redux": "^9.0.4", "react-router-dom": "^5.3.4", - "react-router-dom-v5-compat": "^6.26.2", + "react-router-dom-v5-compat": "^6.28.0", "react-router-scroll-4": "^1.0.0-beta.2", "react-simple-pull-to-refresh": "^1.3.3", "react-sparklines": "^1.7.0", @@ -132,40 +132,41 @@ "sass": "^1.79.4", "stringz": "^2.1.0", "tiny-queue": "^0.2.1", - "tslib": "^2.7.0", - "type-fest": "^4.26.1", - "typescript": "^5.6.2", + "tslib": "^2.8.1", + "type-fest": "^4.30.0", + "typescript": "^5.7.2", "util": "^0.12.5", "valibot": "^0.42.1", - "vite": "^5.4.8", - "vite-plugin-compile-time": "^0.2.1", + "vite": "^6.0.2", + "vite-plugin-compile-time": "^0.3.2", "vite-plugin-html": "^3.2.2", "vite-plugin-require": "^1.2.14", - "vite-plugin-static-copy": "^1.0.6", - "zustand": "^5.0.1", - "zustand-mutative": "^1.0.5" + "vite-plugin-static-copy": "^2.2.0", + "zustand": "^5.0.2", + "zustand-mutative": "^1.1.0" }, "devDependencies": { - "@formatjs/cli": "^6.2.12", + "@formatjs/cli": "^6.3.11", "@jedmao/redux-mock-store": "^3.0.5", - "@stylistic/eslint-plugin": "^2.8.0", + "@sentry/types": "^8.42.0", + "@stylistic/eslint-plugin": "^2.11.0", "@testing-library/jest-dom": "^6.5.0", "@testing-library/react": "^16.0.1", "@testing-library/react-hooks": "^8.0.1", "@testing-library/user-event": "^14.5.2", "@types/leaflet": "^1.9.12", - "@types/lodash": "^4.17.9", + "@types/lodash": "^4.17.13", "@types/path-browserify": "^1.0.3", - "@types/react": "^18.3.11", + "@types/react": "^18.3.13", "@types/react-color": "^3.0.12", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "@types/react-motion": "^0.0.40", "@types/react-router-dom": "^5.3.3", "@types/react-sparklines": "^1.7.5", "@types/react-swipeable-views": "^0.13.5", "@types/redux-mock-store": "^1.0.6", - "@typescript-eslint/eslint-plugin": "^8.14.0", - "@typescript-eslint/parser": "^8.8.0", + "@typescript-eslint/eslint-plugin": "^8.17.0", + "@typescript-eslint/parser": "^8.17.0", "eslint": "^8.57.1", "eslint-import-resolver-typescript": "^3.6.3", "eslint-plugin-compat": "^6.0.1", @@ -178,17 +179,17 @@ "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-tailwindcss": "^3.17.4", "fake-indexeddb": "^6.0.0", - "globals": "^15.10.0", - "husky": "^9.1.6", - "jsdom": "^24.0.0", + "globals": "^15.13.0", + "husky": "^9.1.7", + "jsdom": "^25.0.1", "lint-staged": ">=10", - "rollup-plugin-bundle-stats": "^4.16.0", + "rollup-plugin-bundle-stats": "^4.17.0", "stylelint": "^16.9.0", "stylelint-config-standard-scss": "^12.0.0", - "tailwindcss": "^3.4.13", + "tailwindcss": "^3.4.16", "vite-plugin-checker": "^0.8.0", - "vite-plugin-pwa": "^0.20.5", - "vitest": "^2.1.1" + "vite-plugin-pwa": "^0.21.1", + "vitest": "^2.1.8" }, "resolutions": { "@types/react": "^18.3.11", diff --git a/packages/pl-fe/src/actions/about.test.ts b/packages/pl-fe/src/actions/about.test.ts deleted file mode 100644 index edc1c939c..000000000 --- a/packages/pl-fe/src/actions/about.test.ts +++ /dev/null @@ -1,44 +0,0 @@ -// import MockAdapter from 'axios-mock-adapter'; -import { Map as ImmutableMap } from 'immutable'; - -// import { staticClient } from 'pl-fe/api'; -import { mockStore } from 'pl-fe/jest/test-helpers'; - -import { - FETCH_ABOUT_PAGE_REQUEST, - // FETCH_ABOUT_PAGE_SUCCESS, - FETCH_ABOUT_PAGE_FAIL, - fetchAboutPage, -} from './about'; - -describe('fetchAboutPage()', () => { - // it('creates the expected actions on success', () => { - - // const mock = new MockAdapter(staticClient); - - // mock.onGet('/instance/about/index.html') - // .reply(200, '

Hello world

'); - - // const expectedActions = [ - // { type: FETCH_ABOUT_PAGE_REQUEST, slug: 'index' }, - // { type: FETCH_ABOUT_PAGE_SUCCESS, slug: 'index', html: '

Hello world

' }, - // ]; - // const store = mockStore(ImmutableMap()); - - // return store.dispatch(fetchAboutPage()).then(() => { - // expect(store.getActions()).toEqual(expectedActions); - // }); - // }); - - it('creates the expected actions on failure', () => { - const expectedActions = [ - { type: FETCH_ABOUT_PAGE_REQUEST, slug: 'asdf' }, - { type: FETCH_ABOUT_PAGE_FAIL, slug: 'asdf', error: new Error('Request failed with status code 404') }, - ]; - const store = mockStore(ImmutableMap()); - - return store.dispatch(fetchAboutPage('asdf')).catch(() => { - expect(store.getActions()).toEqual(expectedActions); - }); - }); -}); diff --git a/packages/pl-fe/src/actions/about.ts b/packages/pl-fe/src/actions/about.ts deleted file mode 100644 index abc74c13b..000000000 --- a/packages/pl-fe/src/actions/about.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { staticFetch } from '../api'; - -import type { AppDispatch, RootState } from 'pl-fe/store'; - -const FETCH_ABOUT_PAGE_REQUEST = 'FETCH_ABOUT_PAGE_REQUEST' as const; -const FETCH_ABOUT_PAGE_SUCCESS = 'FETCH_ABOUT_PAGE_SUCCESS' as const; -const FETCH_ABOUT_PAGE_FAIL = 'FETCH_ABOUT_PAGE_FAIL' as const; - -interface FetchAboutPageRequestAction { - type: typeof FETCH_ABOUT_PAGE_REQUEST; - slug: string; - locale?: string; -} - -interface FetchAboutPageSuccessAction { - type: typeof FETCH_ABOUT_PAGE_SUCCESS; - slug: string; - locale?: string; - html: string; -} - -interface FetchAboutPageFailAction { - type: typeof FETCH_ABOUT_PAGE_FAIL; - slug: string; - locale?: string; - error: unknown; -} - -const fetchAboutPage = (slug = 'index', locale?: string) => (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: FETCH_ABOUT_PAGE_REQUEST, slug, locale }); - - const filename = `${slug}${locale ? `.${locale}` : ''}.html`; - return staticFetch(`/instance/about/${filename}`) - .then(({ data: html }) => { - dispatch({ type: FETCH_ABOUT_PAGE_SUCCESS, slug, locale, html }); - return html; - }) - .catch(error => { - dispatch({ type: FETCH_ABOUT_PAGE_FAIL, slug, locale, error }); - throw error; - }); -}; - -type AboutAction = - | FetchAboutPageRequestAction - | FetchAboutPageSuccessAction - | FetchAboutPageFailAction; - -export { - fetchAboutPage, - FETCH_ABOUT_PAGE_REQUEST, - FETCH_ABOUT_PAGE_SUCCESS, - FETCH_ABOUT_PAGE_FAIL, - type AboutAction, -}; diff --git a/packages/pl-fe/src/actions/accounts.test.ts b/packages/pl-fe/src/actions/accounts.test.ts index ef59f6708..8b6b5f10b 100644 --- a/packages/pl-fe/src/actions/accounts.test.ts +++ b/packages/pl-fe/src/actions/accounts.test.ts @@ -4,23 +4,17 @@ import { __stub } from 'pl-fe/api'; import { buildInstance, buildRelationship } from 'pl-fe/jest/factory'; import { mockStore, rootState } from 'pl-fe/jest/test-helpers'; import { normalizeAccount } from 'pl-fe/normalizers/account'; -import { ListRecord, ReducerRecord } from 'pl-fe/reducers/user-lists'; import { - authorizeFollowRequest, blockAccount, createAccount, - expandFollowRequests, fetchAccount, fetchAccountByUsername, - fetchFollowRequests, fetchRelationships, muteAccount, removeFromFollowers, - subscribeAccount, unblockAccount, unmuteAccount, - unsubscribeAccount, } from './accounts'; let store: ReturnType; @@ -940,240 +934,3 @@ describe('fetchRelationships()', () => { }); }); }); - -describe('fetchFollowRequests()', () => { - describe('when logged out', () => { - beforeEach(() => { - const state = { ...rootState, me: null }; - store = mockStore(state); - }); - - it('should do nothing', async() => { - await store.dispatch(fetchFollowRequests()); - const actions = store.getActions(); - - expect(actions).toEqual([]); - }); - }); - - describe('when logged in', () => { - beforeEach(() => { - const state = { ...rootState, me: '123' }; - store = mockStore(state); - }); - - describe('with a successful API request', () => { - beforeEach(() => { - const state = { - ...rootState, - me: '123', - relationships: ImmutableMap(), - }; - - store = mockStore(state); - - __stub((mock) => { - mock.onGet('/api/v1/follow_requests').reply(200, [], { - link: '; rel=\'prev\'', - }); - }); - }); - - it('should dispatch the correct actions', async() => { - const expectedActions = [ - { type: 'FOLLOW_REQUESTS_FETCH_REQUEST' }, - { type: 'ACCOUNTS_IMPORT', accounts: [] }, - { - type: 'FOLLOW_REQUESTS_FETCH_SUCCESS', - accounts: [], - next: null, - }, - ]; - await store.dispatch(fetchFollowRequests()); - const actions = store.getActions(); - - expect(actions).toEqual(expectedActions); - }); - }); - - describe('with an unsuccessful API request', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet('/api/v1/follow_requests').networkError(); - }); - }); - - it('should dispatch the correct actions', async() => { - const expectedActions = [ - { type: 'FOLLOW_REQUESTS_FETCH_REQUEST' }, - { type: 'FOLLOW_REQUESTS_FETCH_FAIL', error: new Error('Network Error') }, - ]; - await store.dispatch(fetchFollowRequests()); - const actions = store.getActions(); - - expect(actions).toEqual(expectedActions); - }); - }); - }); -}); - -describe('expandFollowRequests()', () => { - describe('when logged out', () => { - beforeEach(() => { - const state = { ...rootState, me: null }; - store = mockStore(state); - }); - - it('should do nothing', async() => { - await store.dispatch(expandFollowRequests()); - const actions = store.getActions(); - - expect(actions).toEqual([]); - }); - }); - - describe('when logged in', () => { - beforeEach(() => { - const state = { - ...rootState, - me: '123', - user_lists: ReducerRecord({ - follow_requests: ListRecord({ - next: 'next_url', - }), - }), - }; - store = mockStore(state); - }); - - describe('when the url is null', () => { - beforeEach(() => { - const state = { - ...rootState, - me: '123', - user_lists: ReducerRecord({ - follow_requests: ListRecord({ - next: null, - }), - }), - }; - store = mockStore(state); - }); - - it('should do nothing', async() => { - await store.dispatch(expandFollowRequests()); - const actions = store.getActions(); - - expect(actions).toEqual([]); - }); - }); - - describe('with a successful API request', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet('next_url').reply(200, [], { - link: '; rel=\'prev\'', - }); - }); - }); - - it('should dispatch the correct actions', async() => { - const expectedActions = [ - { type: 'FOLLOW_REQUESTS_EXPAND_REQUEST' }, - { type: 'ACCOUNTS_IMPORT', accounts: [] }, - { - type: 'FOLLOW_REQUESTS_EXPAND_SUCCESS', - accounts: [], - next: null, - }, - ]; - await store.dispatch(expandFollowRequests()); - const actions = store.getActions(); - - expect(actions).toEqual(expectedActions); - }); - }); - - describe('with an unsuccessful API request', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet('next_url').networkError(); - }); - }); - - it('should dispatch the correct actions', async() => { - const expectedActions = [ - { type: 'FOLLOW_REQUESTS_EXPAND_REQUEST' }, - { type: 'FOLLOW_REQUESTS_EXPAND_FAIL', error: new Error('Network Error') }, - ]; - await store.dispatch(expandFollowRequests()); - const actions = store.getActions(); - - expect(actions).toEqual(expectedActions); - }); - }); - }); -}); - -describe('authorizeFollowRequest()', () => { - const id = '1'; - - describe('when logged out', () => { - beforeEach(() => { - const state = { ...rootState, me: null }; - store = mockStore(state); - }); - - it('should do nothing', async() => { - await store.dispatch(authorizeFollowRequest(id)); - const actions = store.getActions(); - - expect(actions).toEqual([]); - }); - }); - - describe('when logged in', () => { - beforeEach(() => { - const state = { ...rootState, me: '123' }; - store = mockStore(state); - }); - - describe('with a successful API request', () => { - beforeEach(() => { - __stub((mock) => { - mock.onPost(`/api/v1/follow_requests/${id}/authorize`).reply(200); - }); - }); - - it('should dispatch the correct actions', async() => { - const expectedActions = [ - { type: 'FOLLOW_REQUEST_AUTHORIZE_REQUEST', id }, - { type: 'FOLLOW_REQUEST_AUTHORIZE_SUCCESS', id }, - ]; - await store.dispatch(authorizeFollowRequest(id)); - const actions = store.getActions(); - - expect(actions).toEqual(expectedActions); - }); - }); - - describe('with an unsuccessful API request', () => { - beforeEach(() => { - __stub((mock) => { - mock.onPost(`/api/v1/follow_requests/${id}/authorize`).networkError(); - }); - }); - - it('should dispatch the correct actions', async() => { - const expectedActions = [ - { type: 'FOLLOW_REQUEST_AUTHORIZE_REQUEST', id }, - { type: 'FOLLOW_REQUEST_AUTHORIZE_FAIL', id, error: new Error('Network Error') }, - ]; - await store.dispatch(authorizeFollowRequest(id)); - const actions = store.getActions(); - - expect(actions).toEqual(expectedActions); - }); - }); - }); -}); diff --git a/packages/pl-fe/src/actions/accounts.ts b/packages/pl-fe/src/actions/accounts.ts index 902e56995..0e32c425d 100644 --- a/packages/pl-fe/src/actions/accounts.ts +++ b/packages/pl-fe/src/actions/accounts.ts @@ -1,12 +1,8 @@ import { PLEROMA, type UpdateNotificationSettingsParams, - type Account, type CreateAccountParams, - type PaginatedResponse, - type PlApiClient, type Relationship, - type Token, } from 'pl-api'; import { Entities } from 'pl-fe/entity-store/entities'; @@ -18,63 +14,14 @@ import { getClient, type PlfeResponse } from '../api'; import { importEntities } from './importer'; -import type { MinifiedSuggestion } from 'pl-fe/api/hooks/trends/use-suggested-accounts'; +import type { MinifiedSuggestion } from 'pl-fe/queries/trends/use-suggested-accounts'; import type { MinifiedStatus } from 'pl-fe/reducers/statuses'; import type { AppDispatch, RootState } from 'pl-fe/store'; import type { History } from 'pl-fe/types/history'; -import type { Me } from 'pl-fe/types/pl-fe'; -const ACCOUNT_CREATE_REQUEST = 'ACCOUNT_CREATE_REQUEST' as const; -const ACCOUNT_CREATE_SUCCESS = 'ACCOUNT_CREATE_SUCCESS' as const; -const ACCOUNT_CREATE_FAIL = 'ACCOUNT_CREATE_FAIL' as const; - -const ACCOUNT_FETCH_REQUEST = 'ACCOUNT_FETCH_REQUEST' as const; -const ACCOUNT_FETCH_SUCCESS = 'ACCOUNT_FETCH_SUCCESS' as const; -const ACCOUNT_FETCH_FAIL = 'ACCOUNT_FETCH_FAIL' as const; - -const ACCOUNT_BLOCK_REQUEST = 'ACCOUNT_BLOCK_REQUEST' as const; const ACCOUNT_BLOCK_SUCCESS = 'ACCOUNT_BLOCK_SUCCESS' as const; -const ACCOUNT_BLOCK_FAIL = 'ACCOUNT_BLOCK_FAIL' as const; -const ACCOUNT_MUTE_REQUEST = 'ACCOUNT_MUTE_REQUEST' as const; const ACCOUNT_MUTE_SUCCESS = 'ACCOUNT_MUTE_SUCCESS' as const; -const ACCOUNT_MUTE_FAIL = 'ACCOUNT_MUTE_FAIL' as const; - -const PINNED_ACCOUNTS_FETCH_REQUEST = 'PINNED_ACCOUNTS_FETCH_REQUEST' as const; -const PINNED_ACCOUNTS_FETCH_SUCCESS = 'PINNED_ACCOUNTS_FETCH_SUCCESS' as const; -const PINNED_ACCOUNTS_FETCH_FAIL = 'PINNED_ACCOUNTS_FETCH_FAIL' as const; - -const ACCOUNT_SEARCH_REQUEST = 'ACCOUNT_SEARCH_REQUEST' as const; -const ACCOUNT_SEARCH_SUCCESS = 'ACCOUNT_SEARCH_SUCCESS' as const; -const ACCOUNT_SEARCH_FAIL = 'ACCOUNT_SEARCH_FAIL' as const; - -const ACCOUNT_LOOKUP_REQUEST = 'ACCOUNT_LOOKUP_REQUEST' as const; -const ACCOUNT_LOOKUP_SUCCESS = 'ACCOUNT_LOOKUP_SUCCESS' as const; -const ACCOUNT_LOOKUP_FAIL = 'ACCOUNT_LOOKUP_FAIL' as const; - -const FOLLOW_REQUESTS_FETCH_REQUEST = 'FOLLOW_REQUESTS_FETCH_REQUEST' as const; -const FOLLOW_REQUESTS_FETCH_SUCCESS = 'FOLLOW_REQUESTS_FETCH_SUCCESS' as const; -const FOLLOW_REQUESTS_FETCH_FAIL = 'FOLLOW_REQUESTS_FETCH_FAIL' as const; - -const FOLLOW_REQUESTS_EXPAND_REQUEST = 'FOLLOW_REQUESTS_EXPAND_REQUEST' as const; -const FOLLOW_REQUESTS_EXPAND_SUCCESS = 'FOLLOW_REQUESTS_EXPAND_SUCCESS' as const; -const FOLLOW_REQUESTS_EXPAND_FAIL = 'FOLLOW_REQUESTS_EXPAND_FAIL' as const; - -const FOLLOW_REQUEST_AUTHORIZE_REQUEST = 'FOLLOW_REQUEST_AUTHORIZE_REQUEST' as const; -const FOLLOW_REQUEST_AUTHORIZE_SUCCESS = 'FOLLOW_REQUEST_AUTHORIZE_SUCCESS' as const; -const FOLLOW_REQUEST_AUTHORIZE_FAIL = 'FOLLOW_REQUEST_AUTHORIZE_FAIL' as const; - -const FOLLOW_REQUEST_REJECT_REQUEST = 'FOLLOW_REQUEST_REJECT_REQUEST' as const; -const FOLLOW_REQUEST_REJECT_SUCCESS = 'FOLLOW_REQUEST_REJECT_SUCCESS' as const; -const FOLLOW_REQUEST_REJECT_FAIL = 'FOLLOW_REQUEST_REJECT_FAIL' as const; - -const NOTIFICATION_SETTINGS_REQUEST = 'NOTIFICATION_SETTINGS_REQUEST' as const; -const NOTIFICATION_SETTINGS_SUCCESS = 'NOTIFICATION_SETTINGS_SUCCESS' as const; -const NOTIFICATION_SETTINGS_FAIL = 'NOTIFICATION_SETTINGS_FAIL' as const; - -const BIRTHDAY_REMINDERS_FETCH_REQUEST = 'BIRTHDAY_REMINDERS_FETCH_REQUEST' as const; -const BIRTHDAY_REMINDERS_FETCH_SUCCESS = 'BIRTHDAY_REMINDERS_FETCH_SUCCESS' as const; -const BIRTHDAY_REMINDERS_FETCH_FAIL = 'BIRTHDAY_REMINDERS_FETCH_FAIL' as const; const maybeRedirectLogin = (error: { response: PlfeResponse }, history?: History) => { // The client is unauthorized - redirect to login. @@ -85,33 +32,11 @@ const maybeRedirectLogin = (error: { response: PlfeResponse }, history?: History const noOp = () => new Promise(f => f(undefined)); -interface AccountCreateRequestAction { - type: typeof ACCOUNT_CREATE_REQUEST; - params: CreateAccountParams; -} - -interface AccountCreateSuccessAction { - type: typeof ACCOUNT_CREATE_SUCCESS; - params: CreateAccountParams; - token: Token; -} - -interface AccountCreateFailAction { - type: typeof ACCOUNT_CREATE_FAIL; - params: CreateAccountParams; - error: unknown; -} - const createAccount = (params: CreateAccountParams) => - async (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: ACCOUNT_CREATE_REQUEST, params }); - return getClient(getState()).settings.createAccount(params).then((token) => - dispatch({ type: ACCOUNT_CREATE_SUCCESS, params, token }), - ).catch(error => { - dispatch({ type: ACCOUNT_CREATE_FAIL, error, params }); - throw error; - }); - }; + async (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState()).settings.createAccount(params).then((token) => + ({ params, token }), + ); const fetchAccount = (accountId: string) => (dispatch: AppDispatch, getState: () => RootState) => { @@ -123,15 +48,11 @@ const fetchAccount = (accountId: string) => return Promise.resolve(null); } - dispatch(fetchAccountRequest(accountId)); - return getClient(getState()).accounts.getAccount(accountId) .then(response => { dispatch(importEntities({ accounts: [response] })); - dispatch(fetchAccountSuccess(response)); }) .catch(error => { - dispatch(fetchAccountFail(accountId, error)); }); }; @@ -144,16 +65,11 @@ const fetchAccountByUsername = (username: string, history?: History) => return getClient(getState()).accounts.getAccount(username).then(response => { dispatch(fetchRelationships([response.id])); dispatch(importEntities({ accounts: [response] })); - dispatch(fetchAccountSuccess(response)); - }).catch(error => { - dispatch(fetchAccountFail(null, error)); }); } else if (features.accountLookup) { return dispatch(accountLookup(username)).then(account => { dispatch(fetchRelationships([account.id])); - dispatch(fetchAccountSuccess(account)); }).catch(error => { - dispatch(fetchAccountFail(null, error)); maybeRedirectLogin(error, history); }); } else { @@ -162,39 +78,17 @@ const fetchAccountByUsername = (username: string, history?: History) => if (found) { dispatch(fetchRelationships([found.id])); - dispatch(fetchAccountSuccess(found)); } else { throw accounts; } - }).catch(error => { - dispatch(fetchAccountFail(null, error)); }); } }; -const fetchAccountRequest = (accountId: string) => ({ - type: ACCOUNT_FETCH_REQUEST, - accountId, -}); - -const fetchAccountSuccess = (account: Account) => ({ - type: ACCOUNT_FETCH_SUCCESS, - account, -}); - -const fetchAccountFail = (accountId: string | null, error: unknown) => ({ - type: ACCOUNT_FETCH_FAIL, - accountId, - error, - skipAlert: true, -}); - const blockAccount = (accountId: string) => (dispatch: AppDispatch, getState: () => RootState) => { if (!isLoggedIn(getState)) return null; - dispatch(blockAccountRequest(accountId)); - return getClient(getState).filtering.blockAccount(accountId) .then(response => { dispatch(importEntities({ relationships: [response] })); @@ -205,7 +99,7 @@ const blockAccount = (accountId: string) => // Pass in entire statuses map so we can use it to filter stuff in different parts of the reducers return dispatch(blockAccountSuccess(response, getState().statuses)); - }).catch(error => dispatch(blockAccountFail(error))); + }); }; const unblockAccount = (accountId: string) => @@ -218,21 +112,12 @@ const unblockAccount = (accountId: string) => }); }; -const blockAccountRequest = (accountId: string) => ({ - type: ACCOUNT_BLOCK_REQUEST, - accountId, -}); - const blockAccountSuccess = (relationship: Relationship, statuses: Record) => ({ type: ACCOUNT_BLOCK_SUCCESS, relationship, statuses, }); -const blockAccountFail = (error: unknown) => ({ - type: ACCOUNT_BLOCK_FAIL, - error, -}); const muteAccount = (accountId: string, notifications?: boolean, duration = 0) => (dispatch: AppDispatch, getState: () => RootState) => { @@ -240,8 +125,6 @@ const muteAccount = (accountId: string, notifications?: boolean, duration = 0) = const client = getClient(getState); - dispatch(muteAccountRequest(accountId)); - const params: Record = { notifications, }; @@ -266,8 +149,7 @@ const muteAccount = (accountId: string, notifications?: boolean, duration = 0) = // Pass in entire statuses map so we can use it to filter stuff in different parts of the reducers return dispatch(muteAccountSuccess(response, getState().statuses)); - }) - .catch(error => dispatch(muteAccountFail(accountId, error))); + }); }; const unmuteAccount = (accountId: string) => @@ -278,23 +160,12 @@ const unmuteAccount = (accountId: string) => .then(response => dispatch(importEntities({ relationships: [response] }))); }; -const muteAccountRequest = (accountId: string) => ({ - type: ACCOUNT_MUTE_REQUEST, - accountId, -}); - const muteAccountSuccess = (relationship: Relationship, statuses: Record) => ({ type: ACCOUNT_MUTE_SUCCESS, relationship, statuses, }); -const muteAccountFail = (accountId: string, error: unknown) => ({ - type: ACCOUNT_MUTE_FAIL, - accountId, - error, -}); - const removeFromFollowers = (accountId: string) => (dispatch: AppDispatch, getState: () => RootState) => { if (!isLoggedIn(getState)) return null; @@ -318,120 +189,6 @@ const fetchRelationships = (accountIds: string[]) => .then(response => dispatch(importEntities({ relationships: response }))); }; -const fetchFollowRequests = () => - (dispatch: AppDispatch, getState: () => RootState) => { - if (!isLoggedIn(getState)) return null; - - dispatch(fetchFollowRequestsRequest()); - - return getClient(getState()).myAccount.getFollowRequests() - .then(response => { - dispatch(importEntities({ accounts: response.items })); - dispatch(fetchFollowRequestsSuccess(response.items, response.next)); - }) - .catch(error => dispatch(fetchFollowRequestsFail(error))); - }; - -const fetchFollowRequestsRequest = () => ({ - type: FOLLOW_REQUESTS_FETCH_REQUEST, -}); - -const fetchFollowRequestsSuccess = (accounts: Array, next: (() => Promise>) | null) => ({ - type: FOLLOW_REQUESTS_FETCH_SUCCESS, - accounts, - next, -}); - -const fetchFollowRequestsFail = (error: unknown) => ({ - type: FOLLOW_REQUESTS_FETCH_FAIL, - error, -}); - -const expandFollowRequests = () => - (dispatch: AppDispatch, getState: () => RootState) => { - if (!isLoggedIn(getState)) return null; - - const next = getState().user_lists.follow_requests.next; - - if (next === null) return null; - - dispatch(expandFollowRequestsRequest()); - - return next().then(response => { - dispatch(importEntities({ accounts: response.items })); - dispatch(expandFollowRequestsSuccess(response.items, response.next)); - }).catch(error => dispatch(expandFollowRequestsFail(error))); - }; - -const expandFollowRequestsRequest = () => ({ - type: FOLLOW_REQUESTS_EXPAND_REQUEST, -}); - -const expandFollowRequestsSuccess = (accounts: Array, next: (() => Promise>) | null) => ({ - type: FOLLOW_REQUESTS_EXPAND_SUCCESS, - accounts, - next, -}); - -const expandFollowRequestsFail = (error: unknown) => ({ - type: FOLLOW_REQUESTS_EXPAND_FAIL, - error, -}); - -const authorizeFollowRequest = (accountId: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - if (!isLoggedIn(getState)) return null; - - dispatch(authorizeFollowRequestRequest(accountId)); - - return getClient(getState()).myAccount.acceptFollowRequest(accountId) - .then(() => dispatch(authorizeFollowRequestSuccess(accountId))) - .catch(error => dispatch(authorizeFollowRequestFail(accountId, error))); - }; - -const authorizeFollowRequestRequest = (accountId: string) => ({ - type: FOLLOW_REQUEST_AUTHORIZE_REQUEST, - accountId, -}); - -const authorizeFollowRequestSuccess = (accountId: string) => ({ - type: FOLLOW_REQUEST_AUTHORIZE_SUCCESS, - accountId, -}); - -const authorizeFollowRequestFail = (accountId: string, error: unknown) => ({ - type: FOLLOW_REQUEST_AUTHORIZE_FAIL, - accountId, - error, -}); - -const rejectFollowRequest = (accountId: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - if (!isLoggedIn(getState)) return; - - dispatch(rejectFollowRequestRequest(accountId)); - - return getClient(getState()).myAccount.rejectFollowRequest(accountId) - .then(() => dispatch(rejectFollowRequestSuccess(accountId))) - .catch(error => dispatch(rejectFollowRequestFail(accountId, error))); - }; - -const rejectFollowRequestRequest = (accountId: string) => ({ - type: FOLLOW_REQUEST_REJECT_REQUEST, - accountId, -}); - -const rejectFollowRequestSuccess = (accountId: string) => ({ - type: FOLLOW_REQUEST_REJECT_SUCCESS, - accountId, -}); - -const rejectFollowRequestFail = (accountId: string, error: unknown) => ({ - type: FOLLOW_REQUEST_REJECT_FAIL, - accountId, - error, -}); - const pinAccount = (accountId: string) => (dispatch: AppDispatch, getState: () => RootState) => { if (!isLoggedIn(getState)) return dispatch(noOp); @@ -450,253 +207,35 @@ const unpinAccount = (accountId: string) => ); }; -interface NotificationSettingsRequestAction { - type: typeof NOTIFICATION_SETTINGS_REQUEST; - params: UpdateNotificationSettingsParams; -} - -interface NotificationSettingsSuccessAction { - type: typeof NOTIFICATION_SETTINGS_SUCCESS; - params: UpdateNotificationSettingsParams; - data: Awaited)['settings']['updateNotificationSettings']>>; -} - -interface NotificationSettingsFailAction { - type: typeof NOTIFICATION_SETTINGS_FAIL; - params: UpdateNotificationSettingsParams; - error: unknown; -} - const updateNotificationSettings = (params: UpdateNotificationSettingsParams) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: NOTIFICATION_SETTINGS_REQUEST, params }); - return getClient(getState).settings.updateNotificationSettings(params).then((data) => { - dispatch({ type: NOTIFICATION_SETTINGS_SUCCESS, params, data }); - }).catch(error => { - dispatch({ type: NOTIFICATION_SETTINGS_FAIL, params, error }); - throw error; - }); - }; - -const fetchPinnedAccounts = (accountId: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch(fetchPinnedAccountsRequest(accountId)); - - return getClient(getState).accounts.getAccountEndorsements(accountId).then(response => { - dispatch(importEntities({ accounts: response })); - dispatch(fetchPinnedAccountsSuccess(accountId, response, null)); - }).catch(error => { - dispatch(fetchPinnedAccountsFail(accountId, error)); - }); - }; - -const fetchPinnedAccountsRequest = (accountId: string) => ({ - type: PINNED_ACCOUNTS_FETCH_REQUEST, - accountId, -}); - -const fetchPinnedAccountsSuccess = (accountId: string, accounts: Array, next: null) => ({ - type: PINNED_ACCOUNTS_FETCH_SUCCESS, - accountId, - accounts, - next, -}); - -const fetchPinnedAccountsFail = (accountId: string, error: unknown) => ({ - type: PINNED_ACCOUNTS_FETCH_FAIL, - accountId, - error, -}); - -interface AccountSearchRequestAction { - type: typeof ACCOUNT_SEARCH_REQUEST; - params: { - q: string; - }; -} - -interface AccountSearchSuccessAction { - type: typeof ACCOUNT_SEARCH_SUCCESS; - accounts: Array; -} - -interface AccountSearchFailAction { - type: typeof ACCOUNT_SEARCH_FAIL; - skipAlert: true; -} + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).settings.updateNotificationSettings(params).then((data) => ({ params, data })); const accountSearch = (q: string, signal?: AbortSignal) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: ACCOUNT_SEARCH_REQUEST, params: { q } }); - return getClient(getState()).accounts.searchAccounts(q, { resolve: false, limit: 4, following: true }, { signal }).then((accounts) => { + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState()).accounts.searchAccounts(q, { resolve: false, limit: 4, following: true }, { signal }).then((accounts) => { dispatch(importEntities({ accounts })); - dispatch({ type: ACCOUNT_SEARCH_SUCCESS, accounts }); return accounts; - }).catch(error => { - dispatch({ type: ACCOUNT_SEARCH_FAIL, skipAlert: true }); - throw error; }); - }; - -interface AccountLookupRequestAction { - type: typeof ACCOUNT_LOOKUP_REQUEST; - acct: string; -} - -interface AccountLookupSuccessAction { - type: typeof ACCOUNT_LOOKUP_SUCCESS; - account: Account; -} - -interface AccountLookupFailAction { - type: typeof ACCOUNT_LOOKUP_FAIL; -} const accountLookup = (acct: string, signal?: AbortSignal) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: ACCOUNT_LOOKUP_REQUEST, acct }); - return getClient(getState()).accounts.lookupAccount(acct, { signal }).then((account) => { + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState()).accounts.lookupAccount(acct, { signal }).then((account) => { if (account && account.id) dispatch(importEntities({ accounts: [account] })); - dispatch({ type: ACCOUNT_LOOKUP_SUCCESS, account }); return account; - }).catch(error => { - dispatch({ type: ACCOUNT_LOOKUP_FAIL }); - throw error; }); - }; - -interface BirthdayRemindersFetchRequestAction { - type: typeof BIRTHDAY_REMINDERS_FETCH_REQUEST; - day: number; - month: number; - accountId: Me; -} - -interface BirthdayRemindersFetchSuccessAction { - type: typeof BIRTHDAY_REMINDERS_FETCH_SUCCESS; - day: number; - month: number; - accountId: string; - accounts: Array; -} - -interface BirthdayRemindersFetchFailAction { - type: typeof BIRTHDAY_REMINDERS_FETCH_FAIL; - day: number; - month: number; - accountId: Me; -} - -const fetchBirthdayReminders = (month: number, day: number) => - (dispatch: AppDispatch, getState: () => RootState) => { - if (!isLoggedIn(getState)) return; - - const me = getState().me as string; - - dispatch({ type: BIRTHDAY_REMINDERS_FETCH_REQUEST, day, month, accountId: me }); - - return getClient(getState).accounts.getBirthdays(day, month).then(response => { - dispatch(importEntities({ accounts: response })); - dispatch({ - type: BIRTHDAY_REMINDERS_FETCH_SUCCESS, - accounts: response, - day, - month, - accountId: me, - }); - }).catch(() => { - dispatch({ type: BIRTHDAY_REMINDERS_FETCH_FAIL, day, month, accountId: me }); - }); - }; const biteAccount = (accountId: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - const client = getClient(getState); - - return client.accounts.biteAccount(accountId); - }; + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).accounts.biteAccount(accountId); type AccountsAction = - | AccountCreateRequestAction - | AccountCreateSuccessAction - | AccountCreateFailAction - | ReturnType - | ReturnType - | ReturnType - | ReturnType | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | NotificationSettingsRequestAction - | NotificationSettingsSuccessAction - | NotificationSettingsFailAction - | ReturnType - | ReturnType - | ReturnType - | AccountSearchRequestAction - | AccountSearchSuccessAction - | AccountSearchFailAction - | AccountLookupRequestAction - | AccountLookupSuccessAction - | AccountLookupFailAction - | BirthdayRemindersFetchSuccessAction - | BirthdayRemindersFetchRequestAction - | BirthdayRemindersFetchFailAction + | ReturnType; export { - ACCOUNT_CREATE_REQUEST, - ACCOUNT_CREATE_SUCCESS, - ACCOUNT_CREATE_FAIL, - ACCOUNT_FETCH_REQUEST, - ACCOUNT_FETCH_SUCCESS, - ACCOUNT_FETCH_FAIL, - ACCOUNT_BLOCK_REQUEST, ACCOUNT_BLOCK_SUCCESS, - ACCOUNT_BLOCK_FAIL, - ACCOUNT_MUTE_REQUEST, ACCOUNT_MUTE_SUCCESS, - ACCOUNT_MUTE_FAIL, - PINNED_ACCOUNTS_FETCH_REQUEST, - PINNED_ACCOUNTS_FETCH_SUCCESS, - PINNED_ACCOUNTS_FETCH_FAIL, - ACCOUNT_SEARCH_REQUEST, - ACCOUNT_SEARCH_SUCCESS, - ACCOUNT_SEARCH_FAIL, - ACCOUNT_LOOKUP_REQUEST, - ACCOUNT_LOOKUP_SUCCESS, - ACCOUNT_LOOKUP_FAIL, - FOLLOW_REQUESTS_FETCH_REQUEST, - FOLLOW_REQUESTS_FETCH_SUCCESS, - FOLLOW_REQUESTS_FETCH_FAIL, - FOLLOW_REQUESTS_EXPAND_REQUEST, - FOLLOW_REQUESTS_EXPAND_SUCCESS, - FOLLOW_REQUESTS_EXPAND_FAIL, - FOLLOW_REQUEST_AUTHORIZE_REQUEST, - FOLLOW_REQUEST_AUTHORIZE_SUCCESS, - FOLLOW_REQUEST_AUTHORIZE_FAIL, - FOLLOW_REQUEST_REJECT_REQUEST, - FOLLOW_REQUEST_REJECT_SUCCESS, - FOLLOW_REQUEST_REJECT_FAIL, - NOTIFICATION_SETTINGS_REQUEST, - NOTIFICATION_SETTINGS_SUCCESS, - NOTIFICATION_SETTINGS_FAIL, - BIRTHDAY_REMINDERS_FETCH_REQUEST, - BIRTHDAY_REMINDERS_FETCH_SUCCESS, - BIRTHDAY_REMINDERS_FETCH_FAIL, createAccount, fetchAccount, fetchAccountByUsername, @@ -706,17 +245,11 @@ export { unmuteAccount, removeFromFollowers, fetchRelationships, - fetchFollowRequests, - expandFollowRequests, - authorizeFollowRequest, - rejectFollowRequest, pinAccount, unpinAccount, updateNotificationSettings, - fetchPinnedAccounts, accountSearch, accountLookup, - fetchBirthdayReminders, biteAccount, type AccountsAction, }; diff --git a/packages/pl-fe/src/actions/admin.ts b/packages/pl-fe/src/actions/admin.ts index ee97042b0..afa3476aa 100644 --- a/packages/pl-fe/src/actions/admin.ts +++ b/packages/pl-fe/src/actions/admin.ts @@ -9,53 +9,21 @@ import { deleteFromTimelines } from './timelines'; import type { Account, AdminAccount, AdminGetAccountsParams, AdminGetReportsParams, AdminReport, PaginatedResponse, PleromaConfig, Status } from 'pl-api'; import type { AppDispatch, RootState } from 'pl-fe/store'; -const ADMIN_CONFIG_FETCH_REQUEST = 'ADMIN_CONFIG_FETCH_REQUEST' as const; const ADMIN_CONFIG_FETCH_SUCCESS = 'ADMIN_CONFIG_FETCH_SUCCESS' as const; -const ADMIN_CONFIG_FETCH_FAIL = 'ADMIN_CONFIG_FETCH_FAIL' as const; const ADMIN_CONFIG_UPDATE_REQUEST = 'ADMIN_CONFIG_UPDATE_REQUEST' as const; const ADMIN_CONFIG_UPDATE_SUCCESS = 'ADMIN_CONFIG_UPDATE_SUCCESS' as const; -const ADMIN_CONFIG_UPDATE_FAIL = 'ADMIN_CONFIG_UPDATE_FAIL' as const; -const ADMIN_REPORTS_FETCH_REQUEST = 'ADMIN_REPORTS_FETCH_REQUEST' as const; const ADMIN_REPORTS_FETCH_SUCCESS = 'ADMIN_REPORTS_FETCH_SUCCESS' as const; -const ADMIN_REPORTS_FETCH_FAIL = 'ADMIN_REPORTS_FETCH_FAIL' as const; -const ADMIN_REPORT_PATCH_REQUEST = 'ADMIN_REPORT_PATCH_REQUEST' as const; const ADMIN_REPORT_PATCH_SUCCESS = 'ADMIN_REPORT_PATCH_SUCCESS' as const; -const ADMIN_REPORT_PATCH_FAIL = 'ADMIN_REPORT_PATCH_FAIL' as const; -const ADMIN_USERS_FETCH_REQUEST = 'ADMIN_USERS_FETCH_REQUEST' as const; const ADMIN_USERS_FETCH_SUCCESS = 'ADMIN_USERS_FETCH_SUCCESS' as const; -const ADMIN_USERS_FETCH_FAIL = 'ADMIN_USERS_FETCH_FAIL' as const; -const ADMIN_USER_DELETE_REQUEST = 'ADMIN_USER_DELETE_REQUEST' as const; const ADMIN_USER_DELETE_SUCCESS = 'ADMIN_USER_DELETE_SUCCESS' as const; -const ADMIN_USER_DELETE_FAIL = 'ADMIN_USER_DELETE_FAIL' as const; const ADMIN_USER_APPROVE_REQUEST = 'ADMIN_USER_APPROVE_REQUEST' as const; const ADMIN_USER_APPROVE_SUCCESS = 'ADMIN_USER_APPROVE_SUCCESS' as const; -const ADMIN_USER_APPROVE_FAIL = 'ADMIN_USER_APPROVE_FAIL' as const; - -const ADMIN_USER_DEACTIVATE_REQUEST = 'ADMIN_USER_DEACTIVATE_REQUEST' as const; -const ADMIN_USER_DEACTIVATE_SUCCESS = 'ADMIN_USER_DEACTIVATE_SUCCESS' as const; -const ADMIN_USER_DEACTIVATE_FAIL = 'ADMIN_USER_DEACTIVATE_FAIL' as const; - -const ADMIN_STATUS_DELETE_REQUEST = 'ADMIN_STATUS_DELETE_REQUEST' as const; -const ADMIN_STATUS_DELETE_SUCCESS = 'ADMIN_STATUS_DELETE_SUCCESS' as const; -const ADMIN_STATUS_DELETE_FAIL = 'ADMIN_STATUS_DELETE_FAIL' as const; - -const ADMIN_STATUS_TOGGLE_SENSITIVITY_REQUEST = 'ADMIN_STATUS_TOGGLE_SENSITIVITY_REQUEST' as const; -const ADMIN_STATUS_TOGGLE_SENSITIVITY_SUCCESS = 'ADMIN_STATUS_TOGGLE_SENSITIVITY_SUCCESS' as const; -const ADMIN_STATUS_TOGGLE_SENSITIVITY_FAIL = 'ADMIN_STATUS_TOGGLE_SENSITIVITY_FAIL' as const; - -const ADMIN_USER_TAG_REQUEST = 'ADMIN_USERS_TAG_REQUEST' as const; -const ADMIN_USER_TAG_SUCCESS = 'ADMIN_USERS_TAG_SUCCESS' as const; -const ADMIN_USER_TAG_FAIL = 'ADMIN_USERS_TAG_FAIL' as const; - -const ADMIN_USER_UNTAG_REQUEST = 'ADMIN_USERS_UNTAG_REQUEST' as const; -const ADMIN_USER_UNTAG_SUCCESS = 'ADMIN_USERS_UNTAG_SUCCESS' as const; -const ADMIN_USER_UNTAG_FAIL = 'ADMIN_USERS_UNTAG_FAIL' as const; const ADMIN_USER_INDEX_EXPAND_FAIL = 'ADMIN_USER_INDEX_EXPAND_FAIL' as const; const ADMIN_USER_INDEX_EXPAND_REQUEST = 'ADMIN_USER_INDEX_EXPAND_REQUEST' as const; @@ -68,15 +36,11 @@ const ADMIN_USER_INDEX_FETCH_SUCCESS = 'ADMIN_USER_INDEX_FETCH_SUCCESS' as const const ADMIN_USER_INDEX_QUERY_SET = 'ADMIN_USER_INDEX_QUERY_SET' as const; const fetchConfig = () => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: ADMIN_CONFIG_FETCH_REQUEST }); - return getClient(getState).admin.config.getPleromaConfig() + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).admin.config.getPleromaConfig() .then((data) => { dispatch({ type: ADMIN_CONFIG_FETCH_SUCCESS, configs: data.configs, needsReboot: data.need_reboot }); - }).catch(error => { - dispatch({ type: ADMIN_CONFIG_FETCH_FAIL, error }); }); - }; const updateConfig = (configs: PleromaConfig['configs']) => (dispatch: AppDispatch, getState: () => RootState) => { @@ -84,8 +48,6 @@ const updateConfig = (configs: PleromaConfig['configs']) => return getClient(getState).admin.config.updatePleromaConfig(configs) .then((data) => { dispatch({ type: ADMIN_CONFIG_UPDATE_SUCCESS, configs: data.configs, needsReboot: data.need_reboot }); - }).catch(error => { - dispatch({ type: ADMIN_CONFIG_UPDATE_FAIL, error, configs }); }); }; @@ -103,49 +65,28 @@ const updatePlFeConfig = (data: Record) => }; const fetchReports = (params?: AdminGetReportsParams) => - (dispatch: AppDispatch, getState: () => RootState) => { - const state = getState(); - - dispatch({ type: ADMIN_REPORTS_FETCH_REQUEST, params }); - - return getClient(state).admin.reports.getReports(params) + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).admin.reports.getReports(params) .then(({ items }) => { items.forEach((report) => { dispatch(importEntities({ statuses: report.statuses as Array, accounts: [report.account?.account, report.target_account?.account] })); dispatch({ type: ADMIN_REPORTS_FETCH_SUCCESS, reports: items, params }); }); - }).catch(error => { - dispatch({ type: ADMIN_REPORTS_FETCH_FAIL, error, params }); }); - }; const closeReport = (reportId: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - const state = getState(); - - dispatch({ type: ADMIN_REPORT_PATCH_REQUEST, reportId }); - - return getClient(state).admin.reports.resolveReport(reportId).then((report) => { - dispatch({ type: ADMIN_REPORT_PATCH_SUCCESS, report, reportId }); - }).catch(error => { - dispatch({ type: ADMIN_REPORT_PATCH_FAIL, error, reportId }); - }); - }; + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).admin.reports.resolveReport(reportId); const fetchUsers = (params?: AdminGetAccountsParams) => (dispatch: AppDispatch, getState: () => RootState) => { const state = getState(); - dispatch({ type: ADMIN_USERS_FETCH_REQUEST, params }); - return getClient(state).admin.accounts.getAccounts(params).then((res) => { dispatch(importEntities({ accounts: res.items.map(({ account }) => account).filter((account): account is Account => account !== null) })); dispatch(fetchRelationships(res.items.map((account) => account.id))); dispatch({ type: ADMIN_USERS_FETCH_SUCCESS, users: res.items, params, next: res.next }); return res; - }).catch(error => { - dispatch({ type: ADMIN_USERS_FETCH_FAIL, error, params }); - throw error; }); }; @@ -153,22 +94,12 @@ const deactivateUser = (accountId: string, report_id?: string) => (dispatch: AppDispatch, getState: () => RootState) => { const state = getState(); - dispatch({ type: ADMIN_USER_DEACTIVATE_REQUEST, accountId }); - return getClient(state).admin.accounts.performAccountAction(accountId, 'suspend', { report_id }); }; const deleteUser = (accountId: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: ADMIN_USER_DELETE_REQUEST, accountId }); - - return getClient(getState).admin.accounts.deleteAccount(accountId) - .then(() => { - dispatch({ type: ADMIN_USER_DELETE_SUCCESS, accountId }); - }).catch(error => { - dispatch({ type: ADMIN_USER_DELETE_FAIL, error, accountId }); - }); - }; + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).admin.accounts.deleteAccount(accountId); const approveUser = (accountId: string) => (dispatch: AppDispatch, getState: () => RootState) => { @@ -176,57 +107,31 @@ const approveUser = (accountId: string) => dispatch({ type: ADMIN_USER_APPROVE_REQUEST, accountId }); - return getClient(state).admin.accounts.approveAccount(accountId) - .then((user) => { - dispatch({ type: ADMIN_USER_APPROVE_SUCCESS, user, accountId }); - }).catch(error => { - dispatch({ type: ADMIN_USER_APPROVE_FAIL, error, accountId }); - }); + return getClient(state).admin.accounts.approveAccount(accountId); }; const deleteStatus = (statusId: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: ADMIN_STATUS_DELETE_REQUEST, statusId }); - return getClient(getState).admin.statuses.deleteStatus(statusId) + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).admin.statuses.deleteStatus(statusId) .then(() => { dispatch(deleteFromTimelines(statusId)); - return dispatch({ type: ADMIN_STATUS_DELETE_SUCCESS, statusId }); - }).catch(error => { - return dispatch({ type: ADMIN_STATUS_DELETE_FAIL, error, statusId }); + return ({ statusId }); }); - }; const toggleStatusSensitivity = (statusId: string, sensitive: boolean) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: ADMIN_STATUS_TOGGLE_SENSITIVITY_REQUEST, statusId }); - return getClient(getState).admin.statuses.updateStatus(statusId, { sensitive: !sensitive }) + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).admin.statuses.updateStatus(statusId, { sensitive: !sensitive }) .then((status) => { dispatch(importEntities({ statuses: [status] })); - dispatch({ type: ADMIN_STATUS_TOGGLE_SENSITIVITY_SUCCESS, statusId, status }); - }).catch(error => { - dispatch({ type: ADMIN_STATUS_TOGGLE_SENSITIVITY_FAIL, error, statusId }); }); - }; const tagUser = (accountId: string, tags: string[]) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: ADMIN_USER_TAG_REQUEST, accountId, tags }); - return getClient(getState).admin.accounts.tagUser(accountId, tags).then(() => { - dispatch({ type: ADMIN_USER_TAG_SUCCESS, accountId, tags }); - }).catch(error => { - dispatch({ type: ADMIN_USER_TAG_FAIL, error, accountId, tags }); - }); - }; + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).admin.accounts.tagUser(accountId, tags); const untagUser = (accountId: string, tags: string[]) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: ADMIN_USER_UNTAG_REQUEST, accountId, tags }); - return getClient(getState).admin.accounts.untagUser(accountId, tags).then(() => { - dispatch({ type: ADMIN_USER_UNTAG_SUCCESS, accountId, tags }); - }).catch(error => { - dispatch({ type: ADMIN_USER_UNTAG_FAIL, error, accountId, tags }); - }); - }; + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).admin.accounts.untagUser(accountId, tags); /** Synchronizes user tags to the backend. */ const setTags = (accountId: string, oldTags: string[], newTags: string[]) => @@ -313,40 +218,15 @@ const expandUserIndex = () => }; type AdminActions = - | { type: typeof ADMIN_CONFIG_FETCH_REQUEST } | { type: typeof ADMIN_CONFIG_FETCH_SUCCESS; configs: PleromaConfig['configs']; needsReboot: boolean } - | { type: typeof ADMIN_CONFIG_FETCH_FAIL; error: unknown } | { type: typeof ADMIN_CONFIG_UPDATE_REQUEST; configs: PleromaConfig['configs'] } | { type: typeof ADMIN_CONFIG_UPDATE_SUCCESS; configs: PleromaConfig['configs']; needsReboot: boolean } - | { type: typeof ADMIN_CONFIG_UPDATE_FAIL; error: unknown; configs: PleromaConfig['configs'] } - | { type: typeof ADMIN_REPORTS_FETCH_REQUEST; params?: AdminGetReportsParams } | { type: typeof ADMIN_REPORTS_FETCH_SUCCESS; reports: Array; params?: AdminGetReportsParams } - | { type: typeof ADMIN_REPORTS_FETCH_FAIL; error: unknown; params?: AdminGetReportsParams } - | { type: typeof ADMIN_REPORT_PATCH_REQUEST; reportId: string } | { type: typeof ADMIN_REPORT_PATCH_SUCCESS; report: AdminReport; reportId: string } - | { type: typeof ADMIN_REPORT_PATCH_FAIL; error: unknown; reportId: string } - | { type: typeof ADMIN_USERS_FETCH_REQUEST; params?: AdminGetAccountsParams } | { type: typeof ADMIN_USERS_FETCH_SUCCESS; users: Array; params?: AdminGetAccountsParams; next: (() => Promise>) | null } - | { type: typeof ADMIN_USERS_FETCH_FAIL; error: unknown; params?: AdminGetAccountsParams } - | { type: typeof ADMIN_USER_DEACTIVATE_REQUEST; accountId: string } - | { type: typeof ADMIN_USER_DELETE_REQUEST; accountId: string } | { type: typeof ADMIN_USER_DELETE_SUCCESS; accountId: string } - | { type: typeof ADMIN_USER_DELETE_FAIL; error: unknown; accountId: string } | { type: typeof ADMIN_USER_APPROVE_REQUEST; accountId: string } | { type: typeof ADMIN_USER_APPROVE_SUCCESS; user: AdminAccount; accountId: string } - | { type: typeof ADMIN_USER_APPROVE_FAIL; error: unknown; accountId: string } - | { type: typeof ADMIN_STATUS_DELETE_REQUEST; statusId: string } - | { type: typeof ADMIN_STATUS_DELETE_SUCCESS; statusId: string } - | { type: typeof ADMIN_STATUS_DELETE_FAIL; error: unknown; statusId: string } - | { type: typeof ADMIN_STATUS_TOGGLE_SENSITIVITY_REQUEST; statusId: string } - | { type: typeof ADMIN_STATUS_TOGGLE_SENSITIVITY_SUCCESS; statusId: string; status: Status } - | { type: typeof ADMIN_STATUS_TOGGLE_SENSITIVITY_FAIL; error: unknown; statusId: string } - | { type: typeof ADMIN_USER_TAG_REQUEST; accountId: string; tags: Array } - | { type: typeof ADMIN_USER_TAG_SUCCESS; accountId: string; tags: Array } - | { type: typeof ADMIN_USER_TAG_FAIL; error: unknown; accountId: string; tags: Array } - | { type: typeof ADMIN_USER_UNTAG_REQUEST; accountId: string; tags: Array } - | { type: typeof ADMIN_USER_UNTAG_SUCCESS; accountId: string; tags: Array } - | { type: typeof ADMIN_USER_UNTAG_FAIL; error: unknown; accountId: string; tags: Array } | ReturnType | { type: typeof ADMIN_USER_INDEX_FETCH_REQUEST } | { type: typeof ADMIN_USER_INDEX_FETCH_SUCCESS; users: Array; total?: number; next: (() => Promise>) | null; params?: AdminGetAccountsParams } @@ -356,42 +236,15 @@ type AdminActions = | { type: typeof ADMIN_USER_INDEX_EXPAND_FAIL }; export { - ADMIN_CONFIG_FETCH_REQUEST, ADMIN_CONFIG_FETCH_SUCCESS, - ADMIN_CONFIG_FETCH_FAIL, ADMIN_CONFIG_UPDATE_REQUEST, ADMIN_CONFIG_UPDATE_SUCCESS, - ADMIN_CONFIG_UPDATE_FAIL, - ADMIN_REPORTS_FETCH_REQUEST, ADMIN_REPORTS_FETCH_SUCCESS, - ADMIN_REPORTS_FETCH_FAIL, - ADMIN_REPORT_PATCH_REQUEST, ADMIN_REPORT_PATCH_SUCCESS, - ADMIN_REPORT_PATCH_FAIL, - ADMIN_USERS_FETCH_REQUEST, ADMIN_USERS_FETCH_SUCCESS, - ADMIN_USERS_FETCH_FAIL, - ADMIN_USER_DELETE_REQUEST, ADMIN_USER_DELETE_SUCCESS, - ADMIN_USER_DELETE_FAIL, ADMIN_USER_APPROVE_REQUEST, ADMIN_USER_APPROVE_SUCCESS, - ADMIN_USER_APPROVE_FAIL, - ADMIN_USER_DEACTIVATE_REQUEST, - ADMIN_USER_DEACTIVATE_SUCCESS, - ADMIN_USER_DEACTIVATE_FAIL, - ADMIN_STATUS_DELETE_REQUEST, - ADMIN_STATUS_DELETE_SUCCESS, - ADMIN_STATUS_DELETE_FAIL, - ADMIN_STATUS_TOGGLE_SENSITIVITY_REQUEST, - ADMIN_STATUS_TOGGLE_SENSITIVITY_SUCCESS, - ADMIN_STATUS_TOGGLE_SENSITIVITY_FAIL, - ADMIN_USER_TAG_REQUEST, - ADMIN_USER_TAG_SUCCESS, - ADMIN_USER_TAG_FAIL, - ADMIN_USER_UNTAG_REQUEST, - ADMIN_USER_UNTAG_SUCCESS, - ADMIN_USER_UNTAG_FAIL, ADMIN_USER_INDEX_EXPAND_FAIL, ADMIN_USER_INDEX_EXPAND_REQUEST, ADMIN_USER_INDEX_EXPAND_SUCCESS, @@ -410,13 +263,7 @@ export { approveUser, deleteStatus, toggleStatusSensitivity, - tagUser, - untagUser, - setTags, setBadges, - promoteToAdmin, - promoteToModerator, - demoteToUser, setRole, setUserIndexQuery, fetchUserIndex, diff --git a/packages/pl-fe/src/actions/aliases.ts b/packages/pl-fe/src/actions/aliases.ts index 764363007..75f56f187 100644 --- a/packages/pl-fe/src/actions/aliases.ts +++ b/packages/pl-fe/src/actions/aliases.ts @@ -11,22 +11,12 @@ import type { Account as BaseAccount } from 'pl-api'; import type { Account } from 'pl-fe/normalizers/account'; import type { AppDispatch, RootState } from 'pl-fe/store'; -const ALIASES_FETCH_REQUEST = 'ALIASES_FETCH_REQUEST' as const; const ALIASES_FETCH_SUCCESS = 'ALIASES_FETCH_SUCCESS' as const; -const ALIASES_FETCH_FAIL = 'ALIASES_FETCH_FAIL' as const; const ALIASES_SUGGESTIONS_CHANGE = 'ALIASES_SUGGESTIONS_CHANGE' as const; const ALIASES_SUGGESTIONS_READY = 'ALIASES_SUGGESTIONS_READY' as const; const ALIASES_SUGGESTIONS_CLEAR = 'ALIASES_SUGGESTIONS_CLEAR' as const; -const ALIASES_ADD_REQUEST = 'ALIASES_ADD_REQUEST' as const; -const ALIASES_ADD_SUCCESS = 'ALIASES_ADD_SUCCESS' as const; -const ALIASES_ADD_FAIL = 'ALIASES_ADD_FAIL' as const; - -const ALIASES_REMOVE_REQUEST = 'ALIASES_REMOVE_REQUEST' as const; -const ALIASES_REMOVE_SUCCESS = 'ALIASES_REMOVE_SUCCESS' as const; -const ALIASES_REMOVE_FAIL = 'ALIASES_REMOVE_FAIL' as const; - const messages = defineMessages({ createSuccess: { id: 'aliases.success.add', defaultMessage: 'Account alias created successfully' }, removeSuccess: { id: 'aliases.success.remove', defaultMessage: 'Account alias removed successfully' }, @@ -34,29 +24,18 @@ const messages = defineMessages({ const fetchAliases = (dispatch: AppDispatch, getState: () => RootState) => { if (!isLoggedIn(getState)) return; - dispatch(fetchAliasesRequest()); return getClient(getState).settings.getAccountAliases() .then(response => { dispatch(fetchAliasesSuccess(response.aliases)); - }) - .catch(err => dispatch(fetchAliasesFail(err))); + }); }; -const fetchAliasesRequest = () => ({ - type: ALIASES_FETCH_REQUEST, -}); - const fetchAliasesSuccess = (aliases: Array) => ({ type: ALIASES_FETCH_SUCCESS, value: aliases, }); -const fetchAliasesFail = (error: unknown) => ({ - type: ALIASES_FETCH_FAIL, - error, -}); - const fetchAliasesSuggestions = (q: string) => (dispatch: AppDispatch, getState: () => RootState) => { if (!isLoggedIn(getState)) return; @@ -86,84 +65,35 @@ const changeAliasesSuggestions = (value: string) => ({ const addToAliases = (account: Account) => (dispatch: AppDispatch, getState: () => RootState) => { if (!isLoggedIn(getState)) return; - dispatch(addToAliasesRequest()); return getClient(getState).settings.addAccountAlias(account.acct).then(() => { toast.success(messages.createSuccess); - dispatch(addToAliasesSuccess); dispatch(fetchAliases); - }) - .catch(err => dispatch(addToAliasesFail(err))); + }); }; -const addToAliasesRequest = () => ({ - type: ALIASES_ADD_REQUEST, -}); - -const addToAliasesSuccess = () => ({ - type: ALIASES_ADD_SUCCESS, -}); - -const addToAliasesFail = (error: unknown) => ({ - type: ALIASES_ADD_FAIL, - error, -}); - const removeFromAliases = (account: string) => (dispatch: AppDispatch, getState: () => RootState) => { if (!isLoggedIn(getState)) return; - dispatch(removeFromAliasesRequest()); return getClient(getState).settings.deleteAccountAlias(account).then(() => { toast.success(messages.removeSuccess); - dispatch(removeFromAliasesSuccess); - dispatch(fetchAliases); - }).catch(err => dispatch(removeFromAliasesFail(err))); + }); }; -const removeFromAliasesRequest = () => ({ - type: ALIASES_REMOVE_REQUEST, -}); - -const removeFromAliasesSuccess = () => ({ - type: ALIASES_REMOVE_SUCCESS, -}); - -const removeFromAliasesFail = (error: unknown) => ({ - type: ALIASES_REMOVE_FAIL, - error, -}); - type AliasesAction = - ReturnType | ReturnType - | ReturnType | ReturnType | ReturnType | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType; export { - ALIASES_FETCH_REQUEST, ALIASES_FETCH_SUCCESS, - ALIASES_FETCH_FAIL, ALIASES_SUGGESTIONS_CHANGE, ALIASES_SUGGESTIONS_READY, ALIASES_SUGGESTIONS_CLEAR, - ALIASES_ADD_REQUEST, - ALIASES_ADD_SUCCESS, - ALIASES_ADD_FAIL, - ALIASES_REMOVE_REQUEST, - ALIASES_REMOVE_SUCCESS, - ALIASES_REMOVE_FAIL, fetchAliases, fetchAliasesSuggestions, - fetchAliasesSuggestionsReady, clearAliasesSuggestions, changeAliasesSuggestions, addToAliases, diff --git a/packages/pl-fe/src/actions/apps.ts b/packages/pl-fe/src/actions/apps.ts index 97a68ef63..25264b910 100644 --- a/packages/pl-fe/src/actions/apps.ts +++ b/packages/pl-fe/src/actions/apps.ts @@ -10,30 +10,12 @@ import { PlApiClient, type CreateApplicationParams } from 'pl-api'; import * as BuildConfig from 'pl-fe/build-config'; -import type { AppDispatch } from 'pl-fe/store'; +const createApp = (params: CreateApplicationParams, baseURL?: string) => { + const client = new PlApiClient(baseURL || BuildConfig.BACKEND_URL || ''); -const APP_CREATE_REQUEST = 'APP_CREATE_REQUEST' as const; -const APP_CREATE_SUCCESS = 'APP_CREATE_SUCCESS' as const; -const APP_CREATE_FAIL = 'APP_CREATE_FAIL' as const; - -const createApp = (params: CreateApplicationParams, baseURL?: string) => - (dispatch: AppDispatch) => { - dispatch({ type: APP_CREATE_REQUEST, params }); - - const client = new PlApiClient(baseURL || BuildConfig.BACKEND_URL || ''); - - return client.apps.createApplication(params).then((app) => { - dispatch({ type: APP_CREATE_SUCCESS, params, app }); - return app; - }).catch(error => { - dispatch({ type: APP_CREATE_FAIL, params, error }); - throw error; - }); - }; + return client.apps.createApplication(params); +}; export { - APP_CREATE_REQUEST, - APP_CREATE_SUCCESS, - APP_CREATE_FAIL, createApp, }; diff --git a/packages/pl-fe/src/actions/auth.ts b/packages/pl-fe/src/actions/auth.ts index a0d6da0bc..d2a303795 100644 --- a/packages/pl-fe/src/actions/auth.ts +++ b/packages/pl-fe/src/actions/auth.ts @@ -53,9 +53,7 @@ const VERIFY_CREDENTIALS_REQUEST = 'VERIFY_CREDENTIALS_REQUEST' as const; const VERIFY_CREDENTIALS_SUCCESS = 'VERIFY_CREDENTIALS_SUCCESS' as const; const VERIFY_CREDENTIALS_FAIL = 'VERIFY_CREDENTIALS_FAIL' as const; -const AUTH_ACCOUNT_REMEMBER_REQUEST = 'AUTH_ACCOUNT_REMEMBER_REQUEST' as const; const AUTH_ACCOUNT_REMEMBER_SUCCESS = 'AUTH_ACCOUNT_REMEMBER_SUCCESS' as const; -const AUTH_ACCOUNT_REMEMBER_FAIL = 'AUTH_ACCOUNT_REMEMBER_FAIL' as const; const customApp = custom('app'); @@ -97,7 +95,7 @@ const createAuthApp = () => website: sourceCode.homepage, }; - return dispatch(createApp(params)).then((app) => + return createApp(params).then((app) => dispatch({ type: AUTH_APP_CREATED, app }), ); }; @@ -120,7 +118,7 @@ const createAppToken = () => scope: getScopes(getState()), }; - return dispatch(obtainOAuthToken(params)).then((token) => + return obtainOAuthToken(params).then((token) => dispatch({ type: AUTH_APP_AUTHORIZED, app, token }), ); }; @@ -139,7 +137,7 @@ const createUserToken = (username: string, password: string) => scope: getScopes(getState()), }; - return dispatch(obtainOAuthToken(params)) + return obtainOAuthToken(params) .then((token) => dispatch(authLoggedIn(token))); }; @@ -207,36 +205,20 @@ const verifyCredentials = (token: string, accountUrl?: string) => }); }; -interface AuthAccountRememberRequestAction { - type: typeof AUTH_ACCOUNT_REMEMBER_REQUEST; - accountUrl: string; -} - interface AuthAccountRememberSuccessAction { type: typeof AUTH_ACCOUNT_REMEMBER_SUCCESS; accountUrl: string; account: CredentialAccount; } -interface AuthAccountRememberFailAction { - type: typeof AUTH_ACCOUNT_REMEMBER_FAIL; - error: unknown; - accountUrl: string; - skipAlert: boolean; -} - const rememberAuthAccount = (accountUrl: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: AUTH_ACCOUNT_REMEMBER_REQUEST, accountUrl }); - return KVStore.getItemOrError(`authAccount:${accountUrl}`).then(account => { + (dispatch: AppDispatch, getState: () => RootState) => + KVStore.getItemOrError(`authAccount:${accountUrl}`).then(account => { dispatch(importEntities({ accounts: [account] })); dispatch({ type: AUTH_ACCOUNT_REMEMBER_SUCCESS, account, accountUrl }); if (account.id === getState().me) dispatch(fetchMeSuccess(account)); return account; - }).catch(error => { - dispatch({ type: AUTH_ACCOUNT_REMEMBER_FAIL, error, accountUrl, skipAlert: true }); }); - }; const loadCredentials = (token: string, accountUrl: string) => (dispatch: AppDispatch) => dispatch(rememberAuthAccount(accountUrl)) @@ -357,9 +339,7 @@ type AuthAction = | VerifyCredentialsRequestAction | VerifyCredentialsSuccessAction | VerifyCredentialsFailAction - | AuthAccountRememberRequestAction - | AuthAccountRememberSuccessAction - | AuthAccountRememberFailAction; + | AuthAccountRememberSuccessAction; export { SWITCH_ACCOUNT, @@ -370,13 +350,10 @@ export { VERIFY_CREDENTIALS_REQUEST, VERIFY_CREDENTIALS_SUCCESS, VERIFY_CREDENTIALS_FAIL, - AUTH_ACCOUNT_REMEMBER_REQUEST, AUTH_ACCOUNT_REMEMBER_SUCCESS, - AUTH_ACCOUNT_REMEMBER_FAIL, messages, otpVerify, verifyCredentials, - rememberAuthAccount, loadCredentials, logIn, logOut, diff --git a/packages/pl-fe/src/actions/backups.ts b/packages/pl-fe/src/actions/backups.ts deleted file mode 100644 index 68e4f6dde..000000000 --- a/packages/pl-fe/src/actions/backups.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { getClient } from '../api'; - -import type { Backup } from 'pl-api'; -import type { AppDispatch, RootState } from 'pl-fe/store'; - -const BACKUPS_FETCH_REQUEST = 'BACKUPS_FETCH_REQUEST' as const; -const BACKUPS_FETCH_SUCCESS = 'BACKUPS_FETCH_SUCCESS' as const; -const BACKUPS_FETCH_FAIL = 'BACKUPS_FETCH_FAIL' as const; - -const BACKUPS_CREATE_REQUEST = 'BACKUPS_CREATE_REQUEST' as const; -const BACKUPS_CREATE_SUCCESS = 'BACKUPS_CREATE_SUCCESS' as const; -const BACKUPS_CREATE_FAIL = 'BACKUPS_CREATE_FAIL' as const; - -interface BackupsFetchRequestAction { - type: typeof BACKUPS_FETCH_REQUEST; -} - -interface BackupsFetchSuccessAction { - type: typeof BACKUPS_FETCH_SUCCESS; - backups: Array; -} - -interface BackupsFetchFailAction { - type: typeof BACKUPS_FETCH_FAIL; - error: unknown; -} - -const fetchBackups = () => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: BACKUPS_FETCH_REQUEST }); - - return getClient(getState).settings.getBackups().then((backups) => - dispatch({ type: BACKUPS_FETCH_SUCCESS, backups }), - ).catch(error => { - dispatch({ type: BACKUPS_FETCH_FAIL, error }); - }); - }; - - interface BackupsCreateRequestAction { - type: typeof BACKUPS_CREATE_REQUEST; - } - - interface BackupsCreateSuccessAction { - type: typeof BACKUPS_CREATE_SUCCESS; - backups: Array; - } - - interface BackupsCreateFailAction { - type: typeof BACKUPS_CREATE_FAIL; - error: unknown; - } - -const createBackup = () => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: BACKUPS_CREATE_REQUEST }); - return getClient(getState).settings.createBackup().then((backup) => - dispatch({ type: BACKUPS_CREATE_SUCCESS, backups: [backup] }), - ).catch(error => { - dispatch({ type: BACKUPS_CREATE_FAIL, error }); - }); - }; - -type BackupsAction = - | BackupsFetchRequestAction - | BackupsFetchSuccessAction - | BackupsFetchFailAction - | BackupsCreateRequestAction - | BackupsCreateSuccessAction - | BackupsCreateFailAction; - -export { - BACKUPS_FETCH_REQUEST, - BACKUPS_FETCH_SUCCESS, - BACKUPS_FETCH_FAIL, - BACKUPS_CREATE_REQUEST, - BACKUPS_CREATE_SUCCESS, - BACKUPS_CREATE_FAIL, - fetchBackups, - createBackup, - type BackupsAction, -}; diff --git a/packages/pl-fe/src/actions/compose.ts b/packages/pl-fe/src/actions/compose.ts index 3d8fb8fed..85918e0ad 100644 --- a/packages/pl-fe/src/actions/compose.ts +++ b/packages/pl-fe/src/actions/compose.ts @@ -13,14 +13,13 @@ import { useSettingsStore } from 'pl-fe/stores/settings'; import toast from 'pl-fe/toast'; import { isLoggedIn } from 'pl-fe/utils/auth'; -import { chooseEmoji } from './emojis'; import { importEntities } from './importer'; -import { rememberLanguageUse } from './languages'; import { uploadFile, updateMedia } from './media'; +import { saveSettings } from './settings'; import { createStatus } from './statuses'; import type { EditorState } from 'lexical'; -import type { Account as BaseAccount, CreateStatusParams, Group, MediaAttachment, Status as BaseStatus, Tag, Poll, ScheduledStatus } from 'pl-api'; +import type { Account as BaseAccount, CreateStatusParams, CustomEmoji, Group, MediaAttachment, Status as BaseStatus, Tag, Poll, ScheduledStatus } from 'pl-api'; import type { AutoSuggestion } from 'pl-fe/components/autosuggest-input'; import type { Emoji } from 'pl-fe/features/emoji'; import type { Account } from 'pl-fe/normalizers/account'; @@ -66,8 +65,6 @@ const COMPOSE_LANGUAGE_ADD = 'COMPOSE_LANGUAGE_ADD' as const; const COMPOSE_LANGUAGE_DELETE = 'COMPOSE_LANGUAGE_DELETE' as const; const COMPOSE_FEDERATED_CHANGE = 'COMPOSE_FEDERATED_CHANGE' as const; -const COMPOSE_EMOJI_INSERT = 'COMPOSE_EMOJI_INSERT' as const; - const COMPOSE_UPLOAD_CHANGE_REQUEST = 'COMPOSE_UPLOAD_UPDATE_REQUEST' as const; const COMPOSE_UPLOAD_CHANGE_SUCCESS = 'COMPOSE_UPLOAD_UPDATE_SUCCESS' as const; const COMPOSE_UPLOAD_CHANGE_FAIL = 'COMPOSE_UPLOAD_UPDATE_FAIL' as const; @@ -303,7 +300,7 @@ const handleComposeSubmit = (dispatch: AppDispatch, getState: () => RootState, c dispatch(insertIntoTagHistory(composeId, data.tags || [], status)); toast.success(edit ? messages.editSuccess : messages.success, { actionLabel: messages.view, - actionLink: `/@${data.account.acct}/posts/${data.id}`, + actionLink: data.visibility === 'direct' ? '/conversations' : `/@${data.account.acct}/posts/${data.id}`, }); } else { toast.success(messages.scheduledSuccess, { @@ -346,7 +343,6 @@ const submitCompose = (composeId: string, opts: SubmitComposeOpts = {}) => const compose = state.compose[composeId]!; - const status = compose.text; const media = compose.media_attachments; const statusId = compose.id; @@ -384,7 +380,8 @@ const submitCompose = (composeId: string, opts: SubmitComposeOpts = {}) => useModalsStore.getState().closeModal('COMPOSE'); if (compose.language && !statusId) { - dispatch(rememberLanguageUse(compose.language)); + useSettingsStore.getState().rememberLanguageUse(compose.language); + dispatch(saveSettings()); } const idempotencyKey = compose.idempotencyKey; @@ -435,9 +432,6 @@ const submitCompose = (composeId: string, opts: SubmitComposeOpts = {}) => } return dispatch(createStatus(params, idempotencyKey, statusId)).then((data) => { - if (!statusId && data.scheduled_at === null && data.visibility === 'direct' && getState().conversations.mounted <= 0 && history) { - history.push('/conversations'); - } handleComposeSubmit(dispatch, getState, composeId, data, status, !!statusId); onSuccess?.(); }).catch((error) => { @@ -598,9 +592,9 @@ const fetchComposeSuggestionsAccounts = throttle((dispatch, getState, composeId, }); }, 200, { leading: true, trailing: true }); -const fetchComposeSuggestionsEmojis = (dispatch: AppDispatch, getState: () => RootState, composeId: string, token: string) => { - const state = getState(); - const results = emojiSearch(token.replace(':', ''), { maxResults: 10 }, state.custom_emojis); +const fetchComposeSuggestionsEmojis = (dispatch: AppDispatch, composeId: string, token: string) => { + const customEmojis = queryClient.getQueryData>(['instance', 'customEmojis']); + const results = emojiSearch(token.replace(':', ''), { maxResults: 10 }, customEmojis); dispatch(readyComposeSuggestionsEmojis(composeId, token, results)); }; @@ -636,7 +630,7 @@ const fetchComposeSuggestions = (composeId: string, token: string) => (dispatch: AppDispatch, getState: () => RootState) => { switch (token[0]) { case ':': - fetchComposeSuggestionsEmojis(dispatch, getState, composeId, token); + fetchComposeSuggestionsEmojis(dispatch, composeId, token); break; case '#': fetchComposeSuggestionsTags(dispatch, getState, composeId, token); @@ -686,7 +680,8 @@ const selectComposeSuggestion = (composeId: string, position: number, token: str completion = isNativeEmoji(suggestion) ? suggestion.native : suggestion.colons; startPosition = position - 1; - dispatch(chooseEmoji(suggestion)); + useSettingsStore.getState().rememberEmojiUse(suggestion); + dispatch(saveSettings()); } else if (typeof suggestion === 'string' && suggestion[0] === '#') { completion = suggestion; startPosition = position - 1; @@ -783,14 +778,6 @@ const deleteComposeLanguage = (composeId: string, value: Language) => ({ value, }); -const insertEmojiCompose = (composeId: string, position: number, emoji: Emoji, needsSpace: boolean) => ({ - type: COMPOSE_EMOJI_INSERT, - composeId, - position, - emoji, - needsSpace, -}); - const addPoll = (composeId: string) => ({ type: COMPOSE_POLL_ADD, composeId, @@ -977,7 +964,6 @@ type ComposeAction = | ReturnType | ReturnType | ReturnType - | ReturnType | ReturnType | ReturnType | ReturnType @@ -1028,7 +1014,6 @@ export { COMPOSE_MODIFIED_LANGUAGE_CHANGE, COMPOSE_LANGUAGE_ADD, COMPOSE_LANGUAGE_DELETE, - COMPOSE_EMOJI_INSERT, COMPOSE_UPLOAD_CHANGE_REQUEST, COMPOSE_UPLOAD_CHANGE_SUCCESS, COMPOSE_UPLOAD_CHANGE_FAIL, @@ -1050,7 +1035,6 @@ export { COMPOSE_ADD_SUGGESTED_LANGUAGE, COMPOSE_FEDERATED_CHANGE, setComposeToStatus, - changeCompose, replyCompose, cancelReplyCompose, quoteCompose, @@ -1059,7 +1043,6 @@ export { mentionCompose, directCompose, directComposeById, - handleComposeSubmit, submitCompose, uploadFile, uploadCompose, @@ -1070,11 +1053,7 @@ export { groupComposeModal, clearComposeSuggestions, fetchComposeSuggestions, - readyComposeSuggestionsEmojis, - readyComposeSuggestionsAccounts, selectComposeSuggestion, - updateSuggestionTags, - updateTagHistory, changeComposeSpoilerness, changeComposeContentType, changeComposeSpoilerText, @@ -1083,7 +1062,6 @@ export { changeComposeModifiedLanguage, addComposeLanguage, deleteComposeLanguage, - insertEmojiCompose, addPoll, removePoll, addSchedule, diff --git a/packages/pl-fe/src/actions/consumer-auth.ts b/packages/pl-fe/src/actions/consumer-auth.ts index 4e66b343d..202e12c2b 100644 --- a/packages/pl-fe/src/actions/consumer-auth.ts +++ b/packages/pl-fe/src/actions/consumer-auth.ts @@ -10,7 +10,7 @@ import { createApp } from './apps'; import type { AppDispatch, RootState } from 'pl-fe/store'; const createProviderApp = () => - async(dispatch: AppDispatch, getState: () => RootState) => { + async (dispatch: AppDispatch, getState: () => RootState) => { const scopes = getScopes(getState()); const params = { @@ -20,7 +20,7 @@ const createProviderApp = () => scopes, }; - return dispatch(createApp(params)); + return createApp(params); }; const prepareRequest = (provider: string) => diff --git a/packages/pl-fe/src/actions/custom-emojis.ts b/packages/pl-fe/src/actions/custom-emojis.ts deleted file mode 100644 index ba1151a8c..000000000 --- a/packages/pl-fe/src/actions/custom-emojis.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { getClient } from '../api'; - -import type { CustomEmoji } from 'pl-api'; -import type { AppDispatch, RootState } from 'pl-fe/store'; - -const CUSTOM_EMOJIS_FETCH_REQUEST = 'CUSTOM_EMOJIS_FETCH_REQUEST' as const; -const CUSTOM_EMOJIS_FETCH_SUCCESS = 'CUSTOM_EMOJIS_FETCH_SUCCESS' as const; -const CUSTOM_EMOJIS_FETCH_FAIL = 'CUSTOM_EMOJIS_FETCH_FAIL' as const; - -const fetchCustomEmojis = () => - (dispatch: AppDispatch, getState: () => RootState) => { - const me = getState().me; - if (!me) return; - - dispatch(fetchCustomEmojisRequest()); - - return getClient(getState()).instance.getCustomEmojis().then(response => { - dispatch(fetchCustomEmojisSuccess(response)); - }).catch(error => { - dispatch(fetchCustomEmojisFail(error)); - }); - }; - -const fetchCustomEmojisRequest = () => ({ - type: CUSTOM_EMOJIS_FETCH_REQUEST, -}); - -const fetchCustomEmojisSuccess = (custom_emojis: Array) => ({ - type: CUSTOM_EMOJIS_FETCH_SUCCESS, - custom_emojis, -}); - -const fetchCustomEmojisFail = (error: unknown) => ({ - type: CUSTOM_EMOJIS_FETCH_FAIL, - error, -}); - -type CustomEmojisAction = - ReturnType - | ReturnType - | ReturnType; - -export { - CUSTOM_EMOJIS_FETCH_REQUEST, - CUSTOM_EMOJIS_FETCH_SUCCESS, - CUSTOM_EMOJIS_FETCH_FAIL, - fetchCustomEmojis, - type CustomEmojisAction, -}; diff --git a/packages/pl-fe/src/actions/domain-blocks.ts b/packages/pl-fe/src/actions/domain-blocks.ts index 439801b06..32942685b 100644 --- a/packages/pl-fe/src/actions/domain-blocks.ts +++ b/packages/pl-fe/src/actions/domain-blocks.ts @@ -5,125 +5,65 @@ import { isLoggedIn } from 'pl-fe/utils/auth'; import { getClient } from '../api'; import type { PaginatedResponse } from 'pl-api'; -import type { MinifiedSuggestion } from 'pl-fe/api/hooks/trends/use-suggested-accounts'; import type { EntityStore } from 'pl-fe/entity-store/types'; import type { Account } from 'pl-fe/normalizers/account'; +import type { MinifiedSuggestion } from 'pl-fe/queries/trends/use-suggested-accounts'; import type { AppDispatch, RootState } from 'pl-fe/store'; -const DOMAIN_BLOCK_REQUEST = 'DOMAIN_BLOCK_REQUEST' as const; -const DOMAIN_BLOCK_SUCCESS = 'DOMAIN_BLOCK_SUCCESS' as const; -const DOMAIN_BLOCK_FAIL = 'DOMAIN_BLOCK_FAIL' as const; - -const DOMAIN_UNBLOCK_REQUEST = 'DOMAIN_UNBLOCK_REQUEST' as const; const DOMAIN_UNBLOCK_SUCCESS = 'DOMAIN_UNBLOCK_SUCCESS' as const; -const DOMAIN_UNBLOCK_FAIL = 'DOMAIN_UNBLOCK_FAIL' as const; -const DOMAIN_BLOCKS_FETCH_REQUEST = 'DOMAIN_BLOCKS_FETCH_REQUEST' as const; const DOMAIN_BLOCKS_FETCH_SUCCESS = 'DOMAIN_BLOCKS_FETCH_SUCCESS' as const; -const DOMAIN_BLOCKS_FETCH_FAIL = 'DOMAIN_BLOCKS_FETCH_FAIL' as const; -const DOMAIN_BLOCKS_EXPAND_REQUEST = 'DOMAIN_BLOCKS_EXPAND_REQUEST' as const; const DOMAIN_BLOCKS_EXPAND_SUCCESS = 'DOMAIN_BLOCKS_EXPAND_SUCCESS' as const; -const DOMAIN_BLOCKS_EXPAND_FAIL = 'DOMAIN_BLOCKS_EXPAND_FAIL' as const; const blockDomain = (domain: string) => (dispatch: AppDispatch, getState: () => RootState) => { if (!isLoggedIn(getState)) return; - dispatch(blockDomainRequest(domain)); - return getClient(getState).filtering.blockDomain(domain).then(() => { // TODO: Update relationships on block const accounts = selectAccountsByDomain(getState(), domain); if (!accounts) return; - dispatch(blockDomainSuccess(domain, accounts)); queryClient.setQueryData>(['suggestions'], suggestions => suggestions ? suggestions.filter((suggestion) => !accounts.includes(suggestion.account_id)) : undefined); - }).catch(err => { - dispatch(blockDomainFail(domain, err)); }); }; -const blockDomainRequest = (domain: string) => ({ - type: DOMAIN_BLOCK_REQUEST, - domain, -}); - -const blockDomainSuccess = (domain: string, accounts: string[]) => ({ - type: DOMAIN_BLOCK_SUCCESS, - domain, - accounts, -}); - -const blockDomainFail = (domain: string, error: unknown) => ({ - type: DOMAIN_BLOCK_FAIL, - domain, - error, -}); - const unblockDomain = (domain: string) => (dispatch: AppDispatch, getState: () => RootState) => { if (!isLoggedIn(getState)) return; - dispatch(unblockDomainRequest(domain)); - return getClient(getState).filtering.unblockDomain(domain).then(() => { // TODO: Update relationships on unblock const accounts = selectAccountsByDomain(getState(), domain); if (!accounts) return; dispatch(unblockDomainSuccess(domain, accounts)); - }).catch(err => { - dispatch(unblockDomainFail(domain, err)); - }); + }).catch(() => {}); }; -const unblockDomainRequest = (domain: string) => ({ - type: DOMAIN_UNBLOCK_REQUEST, - domain, -}); - const unblockDomainSuccess = (domain: string, accounts: string[]) => ({ type: DOMAIN_UNBLOCK_SUCCESS, domain, accounts, }); -const unblockDomainFail = (domain: string, error: unknown) => ({ - type: DOMAIN_UNBLOCK_FAIL, - domain, - error, -}); - const fetchDomainBlocks = () => (dispatch: AppDispatch, getState: () => RootState) => { if (!isLoggedIn(getState)) return; - dispatch(fetchDomainBlocksRequest()); - return getClient(getState).filtering.getDomainBlocks().then(response => { dispatch(fetchDomainBlocksSuccess(response.items, response.next)); - }).catch(err => { - dispatch(fetchDomainBlocksFail(err)); }); }; -const fetchDomainBlocksRequest = () => ({ - type: DOMAIN_BLOCKS_FETCH_REQUEST, -}); - const fetchDomainBlocksSuccess = (domains: string[], next: (() => Promise>) | null) => ({ type: DOMAIN_BLOCKS_FETCH_SUCCESS, domains, next, }); -const fetchDomainBlocksFail = (error: unknown) => ({ - type: DOMAIN_BLOCKS_FETCH_FAIL, - error, -}); - const expandDomainBlocks = () => (dispatch: AppDispatch, getState: () => RootState) => { if (!isLoggedIn(getState)) return; @@ -132,13 +72,9 @@ const expandDomainBlocks = () => if (!next) return; - dispatch(expandDomainBlocksRequest()); - next().then(response => { dispatch(expandDomainBlocksSuccess(response.items, response.next)); - }).catch(err => { - dispatch(expandDomainBlocksFail(err)); - }); + }).catch(() => {}); }; const selectAccountsByDomain = (state: RootState, domain: string): string[] => { @@ -150,48 +86,21 @@ const selectAccountsByDomain = (state: RootState, domain: string): string[] => { return accounts || []; }; -const expandDomainBlocksRequest = () => ({ - type: DOMAIN_BLOCKS_EXPAND_REQUEST, -}); - const expandDomainBlocksSuccess = (domains: string[], next: (() => Promise>) | null) => ({ type: DOMAIN_BLOCKS_EXPAND_SUCCESS, domains, next, }); -const expandDomainBlocksFail = (error: unknown) => ({ - type: DOMAIN_BLOCKS_EXPAND_FAIL, - error, -}); - type DomainBlocksAction = - ReturnType - | ReturnType - | ReturnType - | ReturnType | ReturnType - | ReturnType - | ReturnType | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType; + | ReturnType; export { - DOMAIN_BLOCK_REQUEST, - DOMAIN_BLOCK_SUCCESS, - DOMAIN_BLOCK_FAIL, - DOMAIN_UNBLOCK_REQUEST, DOMAIN_UNBLOCK_SUCCESS, - DOMAIN_UNBLOCK_FAIL, - DOMAIN_BLOCKS_FETCH_REQUEST, DOMAIN_BLOCKS_FETCH_SUCCESS, - DOMAIN_BLOCKS_FETCH_FAIL, - DOMAIN_BLOCKS_EXPAND_REQUEST, DOMAIN_BLOCKS_EXPAND_SUCCESS, - DOMAIN_BLOCKS_EXPAND_FAIL, blockDomain, unblockDomain, fetchDomainBlocks, diff --git a/packages/pl-fe/src/actions/emoji-reacts.ts b/packages/pl-fe/src/actions/emoji-reacts.ts index 5d5bb83c3..5531452fb 100644 --- a/packages/pl-fe/src/actions/emoji-reacts.ts +++ b/packages/pl-fe/src/actions/emoji-reacts.ts @@ -8,12 +8,9 @@ import type { Status } from 'pl-api'; import type { AppDispatch, RootState } from 'pl-fe/store'; const EMOJI_REACT_REQUEST = 'EMOJI_REACT_REQUEST' as const; -const EMOJI_REACT_SUCCESS = 'EMOJI_REACT_SUCCESS' as const; const EMOJI_REACT_FAIL = 'EMOJI_REACT_FAIL' as const; const UNEMOJI_REACT_REQUEST = 'UNEMOJI_REACT_REQUEST' as const; -const UNEMOJI_REACT_SUCCESS = 'UNEMOJI_REACT_SUCCESS' as const; -const UNEMOJI_REACT_FAIL = 'UNEMOJI_REACT_FAIL' as const; const noOp = () => () => new Promise(f => f(undefined)); @@ -25,7 +22,6 @@ const emojiReact = (status: Pick, emoji: string, custom?: string) return getClient(getState).statuses.createStatusReaction(status.id, emoji).then((response) => { dispatch(importEntities({ statuses: [response] })); - dispatch(emojiReactSuccess(response, emoji)); }).catch((error) => { dispatch(emojiReactFail(status.id, emoji, error)); }); @@ -39,9 +35,6 @@ const unEmojiReact = (status: Pick, emoji: string) => return getClient(getState).statuses.deleteStatusReaction(status.id, emoji).then(response => { dispatch(importEntities({ statuses: [response] })); - dispatch(unEmojiReactSuccess(response, emoji)); - }).catch(error => { - dispatch(unEmojiReactFail(status.id, emoji, error)); }); }; @@ -52,13 +45,6 @@ const emojiReactRequest = (statusId: string, emoji: string, custom?: string) => custom, }); -const emojiReactSuccess = (status: Status, emoji: string) => ({ - type: EMOJI_REACT_SUCCESS, - status, - statusId: status.id, - emoji, -}); - const emojiReactFail = (statusId: string, emoji: string, error: unknown) => ({ type: EMOJI_REACT_FAIL, statusId, @@ -72,35 +58,15 @@ const unEmojiReactRequest = (statusId: string, emoji: string) => ({ emoji, }); -const unEmojiReactSuccess = (status: Status, emoji: string) => ({ - type: UNEMOJI_REACT_SUCCESS, - status, - statusId: status.id, - emoji, -}); - -const unEmojiReactFail = (statusId: string, emoji: string, error: unknown) => ({ - type: UNEMOJI_REACT_FAIL, - statusId, - emoji, - error, -}); - type EmojiReactsAction = | ReturnType - | ReturnType | ReturnType | ReturnType - | ReturnType - | ReturnType export { EMOJI_REACT_REQUEST, - EMOJI_REACT_SUCCESS, EMOJI_REACT_FAIL, UNEMOJI_REACT_REQUEST, - UNEMOJI_REACT_SUCCESS, - UNEMOJI_REACT_FAIL, emojiReact, unEmojiReact, type EmojiReactsAction, diff --git a/packages/pl-fe/src/actions/emojis.ts b/packages/pl-fe/src/actions/emojis.ts deleted file mode 100644 index b4b949314..000000000 --- a/packages/pl-fe/src/actions/emojis.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { saveSettings } from './settings'; - -import type { Emoji } from 'pl-fe/features/emoji'; -import type { AppDispatch } from 'pl-fe/store'; - -const EMOJI_CHOOSE = 'EMOJI_CHOOSE'; - -const chooseEmoji = (emoji: Emoji) => - (dispatch: AppDispatch) => { - dispatch({ - type: EMOJI_CHOOSE, - emoji, - }); - - dispatch(saveSettings()); - }; - -export { - EMOJI_CHOOSE, - chooseEmoji, -}; diff --git a/packages/pl-fe/src/actions/events.ts b/packages/pl-fe/src/actions/events.ts index 944528869..4d122c802 100644 --- a/packages/pl-fe/src/actions/events.ts +++ b/packages/pl-fe/src/actions/events.ts @@ -6,45 +6,15 @@ import toast from 'pl-fe/toast'; import { importEntities } from './importer'; import { STATUS_FETCH_SOURCE_FAIL, STATUS_FETCH_SOURCE_REQUEST, STATUS_FETCH_SOURCE_SUCCESS } from './statuses'; -import type { Account, CreateEventParams, Location, MediaAttachment, PaginatedResponse, Status } from 'pl-api'; +import type { CreateEventParams, Location, MediaAttachment, PaginatedResponse, Status } from 'pl-api'; import type { AppDispatch, RootState } from 'pl-fe/store'; -const EVENT_SUBMIT_REQUEST = 'EVENT_SUBMIT_REQUEST' as const; -const EVENT_SUBMIT_SUCCESS = 'EVENT_SUBMIT_SUCCESS' as const; -const EVENT_SUBMIT_FAIL = 'EVENT_SUBMIT_FAIL' as const; - const EVENT_JOIN_REQUEST = 'EVENT_JOIN_REQUEST' as const; -const EVENT_JOIN_SUCCESS = 'EVENT_JOIN_SUCCESS' as const; const EVENT_JOIN_FAIL = 'EVENT_JOIN_FAIL' as const; const EVENT_LEAVE_REQUEST = 'EVENT_LEAVE_REQUEST' as const; -const EVENT_LEAVE_SUCCESS = 'EVENT_LEAVE_SUCCESS' as const; const EVENT_LEAVE_FAIL = 'EVENT_LEAVE_FAIL' as const; -const EVENT_PARTICIPATIONS_FETCH_REQUEST = 'EVENT_PARTICIPATIONS_FETCH_REQUEST' as const; -const EVENT_PARTICIPATIONS_FETCH_SUCCESS = 'EVENT_PARTICIPATIONS_FETCH_SUCCESS' as const; -const EVENT_PARTICIPATIONS_FETCH_FAIL = 'EVENT_PARTICIPATIONS_FETCH_FAIL' as const; - -const EVENT_PARTICIPATIONS_EXPAND_REQUEST = 'EVENT_PARTICIPATIONS_EXPAND_REQUEST' as const; -const EVENT_PARTICIPATIONS_EXPAND_SUCCESS = 'EVENT_PARTICIPATIONS_EXPAND_SUCCESS' as const; -const EVENT_PARTICIPATIONS_EXPAND_FAIL = 'EVENT_PARTICIPATIONS_EXPAND_FAIL' as const; - -const EVENT_PARTICIPATION_REQUESTS_FETCH_REQUEST = 'EVENT_PARTICIPATION_REQUESTS_FETCH_REQUEST' as const; -const EVENT_PARTICIPATION_REQUESTS_FETCH_SUCCESS = 'EVENT_PARTICIPATION_REQUESTS_FETCH_SUCCESS' as const; -const EVENT_PARTICIPATION_REQUESTS_FETCH_FAIL = 'EVENT_PARTICIPATION_REQUESTS_FETCH_FAIL' as const; - -const EVENT_PARTICIPATION_REQUESTS_EXPAND_REQUEST = 'EVENT_PARTICIPATION_REQUESTS_EXPAND_REQUEST' as const; -const EVENT_PARTICIPATION_REQUESTS_EXPAND_SUCCESS = 'EVENT_PARTICIPATION_REQUESTS_EXPAND_SUCCESS' as const; -const EVENT_PARTICIPATION_REQUESTS_EXPAND_FAIL = 'EVENT_PARTICIPATION_REQUESTS_EXPAND_FAIL' as const; - -const EVENT_PARTICIPATION_REQUEST_AUTHORIZE_REQUEST = 'EVENT_PARTICIPATION_REQUEST_AUTHORIZE_REQUEST' as const; -const EVENT_PARTICIPATION_REQUEST_AUTHORIZE_SUCCESS = 'EVENT_PARTICIPATION_REQUEST_AUTHORIZE_SUCCESS' as const; -const EVENT_PARTICIPATION_REQUEST_AUTHORIZE_FAIL = 'EVENT_PARTICIPATION_REQUEST_AUTHORIZE_FAIL' as const; - -const EVENT_PARTICIPATION_REQUEST_REJECT_REQUEST = 'EVENT_PARTICIPATION_REQUEST_REJECT_REQUEST' as const; -const EVENT_PARTICIPATION_REQUEST_REJECT_SUCCESS = 'EVENT_PARTICIPATION_REQUEST_REJECT_SUCCESS' as const; -const EVENT_PARTICIPATION_REQUEST_REJECT_FAIL = 'EVENT_PARTICIPATION_REQUEST_REJECT_FAIL' as const; - const EVENT_COMPOSE_CANCEL = 'EVENT_COMPOSE_CANCEL' as const; const EVENT_FORM_SET = 'EVENT_FORM_SET' as const; @@ -95,8 +65,6 @@ const submitEvent = ({ return; } - dispatch(submitEventRequest()); - const params: CreateEventParams = { name, status, @@ -115,7 +83,6 @@ const submitEvent = ({ : getClient(state).events.editEvent(statusId, params) ).then((data) => { dispatch(importEntities({ statuses: [data] })); - dispatch(submitEventSuccess(data)); toast.success( statusId ? messages.editSuccess : messages.success, { @@ -125,25 +92,9 @@ const submitEvent = ({ ); return data; - }).catch((error) => { - dispatch(submitEventFail(error)); }); }; -const submitEventRequest = () => ({ - type: EVENT_SUBMIT_REQUEST, -}); - -const submitEventSuccess = (status: Status) => ({ - type: EVENT_SUBMIT_SUCCESS, - status, -}); - -const submitEventFail = (error: unknown) => ({ - type: EVENT_SUBMIT_FAIL, - error, -}); - const joinEvent = (statusId: string, participationMessage?: string) => (dispatch: AppDispatch, getState: () => RootState) => { const status = getState().statuses[statusId]; @@ -156,7 +107,6 @@ const joinEvent = (statusId: string, participationMessage?: string) => return getClient(getState).events.joinEvent(statusId, participationMessage).then((data) => { dispatch(importEntities({ statuses: [data] })); - dispatch(joinEventSuccess(status.id)); toast.success( data.event?.join_state === 'pending' ? messages.joinRequestSuccess : messages.joinSuccess, { @@ -174,11 +124,6 @@ const joinEventRequest = (statusId: string) => ({ statusId, }); -const joinEventSuccess = (statusId: string) => ({ - type: EVENT_JOIN_SUCCESS, - statusId, -}); - const joinEventFail = (error: unknown, statusId: string, previousState: Exclude['join_state'] | null) => ({ type: EVENT_JOIN_FAIL, error, @@ -198,7 +143,6 @@ const leaveEvent = (statusId: string) => return getClient(getState).events.leaveEvent(statusId).then((data) => { dispatch(importEntities({ statuses: [data] })); - dispatch(leaveEventSuccess(status.id)); }).catch((error) => { dispatch(leaveEventFail(error, status.id, status?.event?.join_state || null)); }); @@ -209,11 +153,6 @@ const leaveEventRequest = (statusId: string) => ({ statusId, }); -const leaveEventSuccess = (statusId: string) => ({ - type: EVENT_LEAVE_SUCCESS, - statusId, -}); - const leaveEventFail = (error: unknown, statusId: string, previousState: Exclude['join_state'] | null) => ({ type: EVENT_LEAVE_FAIL, statusId, @@ -221,202 +160,6 @@ const leaveEventFail = (error: unknown, statusId: string, previousState: Exclude previousState, }); -const fetchEventParticipations = (statusId: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch(fetchEventParticipationsRequest(statusId)); - - return getClient(getState).events.getEventParticipations(statusId).then(response => { - dispatch(importEntities({ accounts: response.items })); - return dispatch(fetchEventParticipationsSuccess(statusId, response.items, response.next)); - }).catch(error => { - dispatch(fetchEventParticipationsFail(statusId, error)); - }); - }; - -const fetchEventParticipationsRequest = (statusId: string) => ({ - type: EVENT_PARTICIPATIONS_FETCH_REQUEST, - statusId, -}); - -const fetchEventParticipationsSuccess = (statusId: string, accounts: Array, next: (() => Promise>) | null) => ({ - type: EVENT_PARTICIPATIONS_FETCH_SUCCESS, - statusId, - accounts, - next, -}); - -const fetchEventParticipationsFail = (statusId: string, error: unknown) => ({ - type: EVENT_PARTICIPATIONS_FETCH_FAIL, - statusId, - error, -}); - -const expandEventParticipations = (statusId: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - const next = getState().user_lists.event_participations[statusId]?.next || null; - - if (next === null) { - return dispatch(noOp); - } - - dispatch(expandEventParticipationsRequest(statusId)); - - return next().then(response => { - dispatch(importEntities({ accounts: response.items })); - return dispatch(expandEventParticipationsSuccess(statusId, response.items, response.next)); - }).catch(error => { - dispatch(expandEventParticipationsFail(statusId, error)); - }); - }; - -const expandEventParticipationsRequest = (statusId: string) => ({ - type: EVENT_PARTICIPATIONS_EXPAND_REQUEST, - statusId, -}); - -const expandEventParticipationsSuccess = (statusId: string, accounts: Array, next: (() => Promise>) | null) => ({ - type: EVENT_PARTICIPATIONS_EXPAND_SUCCESS, - statusId, - accounts, - next, -}); - -const expandEventParticipationsFail = (statusId: string, error: unknown) => ({ - type: EVENT_PARTICIPATIONS_EXPAND_FAIL, - statusId, - error, -}); - -const fetchEventParticipationRequests = (statusId: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch(fetchEventParticipationRequestsRequest(statusId)); - - return getClient(getState).events.getEventParticipationRequests(statusId).then(response => { - dispatch(importEntities({ accounts: response.items.map(({ account }) => account) })); - return dispatch(fetchEventParticipationRequestsSuccess(statusId, response.items, response.next)); - }).catch(error => { - dispatch(fetchEventParticipationRequestsFail(statusId, error)); - }); - }; - -const fetchEventParticipationRequestsRequest = (statusId: string) => ({ - type: EVENT_PARTICIPATION_REQUESTS_FETCH_REQUEST, - statusId, -}); - -const fetchEventParticipationRequestsSuccess = (statusId: string, participations: Array<{ - account: Account; - participation_message: string; -}>, next: (() => Promise>) | null) => ({ - type: EVENT_PARTICIPATION_REQUESTS_FETCH_SUCCESS, - statusId, - participations, - next, -}); - -const fetchEventParticipationRequestsFail = (statusId: string, error: unknown) => ({ - type: EVENT_PARTICIPATION_REQUESTS_FETCH_FAIL, - statusId, - error, -}); - -const expandEventParticipationRequests = (statusId: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - const next = getState().user_lists.event_participation_requests[statusId]?.next || null; - - if (next === null) { - return dispatch(noOp); - } - - dispatch(expandEventParticipationRequestsRequest(statusId)); - - return next().then(response => { - dispatch(importEntities({ accounts: response.items.map(({ account }) => account) })); - return dispatch(expandEventParticipationRequestsSuccess(statusId, response.items, response.next)); - }).catch(error => { - dispatch(expandEventParticipationRequestsFail(statusId, error)); - }); - }; - -const expandEventParticipationRequestsRequest = (statusId: string) => ({ - type: EVENT_PARTICIPATION_REQUESTS_EXPAND_REQUEST, - statusId, -}); - -const expandEventParticipationRequestsSuccess = (statusId: string, participations: Array<{ - account: Account; - participation_message: string; -}>, next: (() => Promise>) | null) => ({ - type: EVENT_PARTICIPATION_REQUESTS_EXPAND_SUCCESS, - statusId, - participations, - next, -}); - -const expandEventParticipationRequestsFail = (statusId: string, error: unknown) => ({ - type: EVENT_PARTICIPATION_REQUESTS_EXPAND_FAIL, - statusId, - error, -}); - -const authorizeEventParticipationRequest = (statusId: string, accountId: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch(authorizeEventParticipationRequestRequest(statusId, accountId)); - - return getClient(getState).events.acceptEventParticipationRequest(statusId, accountId).then(() => { - dispatch(authorizeEventParticipationRequestSuccess(statusId, accountId)); - toast.success(messages.authorized); - }).catch(error => dispatch(authorizeEventParticipationRequestFail(statusId, accountId, error))); - }; - -const authorizeEventParticipationRequestRequest = (statusId: string, accountId: string) => ({ - type: EVENT_PARTICIPATION_REQUEST_AUTHORIZE_REQUEST, - statusId, - accountId, -}); - -const authorizeEventParticipationRequestSuccess = (statusId: string, accountId: string) => ({ - type: EVENT_PARTICIPATION_REQUEST_AUTHORIZE_SUCCESS, - statusId, - accountId, -}); - -const authorizeEventParticipationRequestFail = (statusId: string, accountId: string, error: unknown) => ({ - type: EVENT_PARTICIPATION_REQUEST_AUTHORIZE_FAIL, - statusId, - accountId, - error, -}); - -const rejectEventParticipationRequest = (statusId: string, accountId: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch(rejectEventParticipationRequestRequest(statusId, accountId)); - - return getClient(getState).events.rejectEventParticipationRequest(statusId, accountId).then(() => { - dispatch(rejectEventParticipationRequestSuccess(statusId, accountId)); - toast.success(messages.rejected); - }).catch(error => dispatch(rejectEventParticipationRequestFail(statusId, accountId, error))); - }; - -const rejectEventParticipationRequestRequest = (statusId: string, accountId: string) => ({ - type: EVENT_PARTICIPATION_REQUEST_REJECT_REQUEST, - statusId, - accountId, -}); - -const rejectEventParticipationRequestSuccess = (statusId: string, accountId: string) => ({ - type: EVENT_PARTICIPATION_REQUEST_REJECT_SUCCESS, - statusId, - accountId, -}); - -const rejectEventParticipationRequestFail = (statusId: string, accountId: string, error: unknown) => ({ - type: EVENT_PARTICIPATION_REQUEST_REJECT_FAIL, - statusId, - accountId, - error, -}); - const fetchEventIcs = (statusId: string) => (dispatch: AppDispatch, getState: () => RootState) => getClient(getState).events.getEventIcs(statusId); @@ -490,35 +233,10 @@ const fetchJoinedEvents = () => }; type EventsAction = - | ReturnType - | ReturnType - | ReturnType | ReturnType - | ReturnType | ReturnType | ReturnType - | ReturnType | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType | ReturnType | EventFormSetAction | { type: typeof RECENT_EVENTS_FETCH_REQUEST } @@ -529,33 +247,10 @@ type EventsAction = | { type: typeof JOINED_EVENTS_FETCH_FAIL; error: unknown } export { - EVENT_SUBMIT_REQUEST, - EVENT_SUBMIT_SUCCESS, - EVENT_SUBMIT_FAIL, EVENT_JOIN_REQUEST, - EVENT_JOIN_SUCCESS, EVENT_JOIN_FAIL, EVENT_LEAVE_REQUEST, - EVENT_LEAVE_SUCCESS, EVENT_LEAVE_FAIL, - EVENT_PARTICIPATIONS_FETCH_REQUEST, - EVENT_PARTICIPATIONS_FETCH_SUCCESS, - EVENT_PARTICIPATIONS_FETCH_FAIL, - EVENT_PARTICIPATIONS_EXPAND_REQUEST, - EVENT_PARTICIPATIONS_EXPAND_SUCCESS, - EVENT_PARTICIPATIONS_EXPAND_FAIL, - EVENT_PARTICIPATION_REQUESTS_FETCH_REQUEST, - EVENT_PARTICIPATION_REQUESTS_FETCH_SUCCESS, - EVENT_PARTICIPATION_REQUESTS_FETCH_FAIL, - EVENT_PARTICIPATION_REQUESTS_EXPAND_REQUEST, - EVENT_PARTICIPATION_REQUESTS_EXPAND_SUCCESS, - EVENT_PARTICIPATION_REQUESTS_EXPAND_FAIL, - EVENT_PARTICIPATION_REQUEST_AUTHORIZE_REQUEST, - EVENT_PARTICIPATION_REQUEST_AUTHORIZE_SUCCESS, - EVENT_PARTICIPATION_REQUEST_AUTHORIZE_FAIL, - EVENT_PARTICIPATION_REQUEST_REJECT_REQUEST, - EVENT_PARTICIPATION_REQUEST_REJECT_SUCCESS, - EVENT_PARTICIPATION_REQUEST_REJECT_FAIL, EVENT_COMPOSE_CANCEL, EVENT_FORM_SET, RECENT_EVENTS_FETCH_REQUEST, @@ -567,12 +262,6 @@ export { submitEvent, joinEvent, leaveEvent, - fetchEventParticipations, - expandEventParticipations, - fetchEventParticipationRequests, - expandEventParticipationRequests, - authorizeEventParticipationRequest, - rejectEventParticipationRequest, fetchEventIcs, cancelEventCompose, initEventEdit, diff --git a/packages/pl-fe/src/actions/export-data.ts b/packages/pl-fe/src/actions/export-data.ts index 9c28c1911..05ed669a0 100644 --- a/packages/pl-fe/src/actions/export-data.ts +++ b/packages/pl-fe/src/actions/export-data.ts @@ -5,19 +5,7 @@ import { normalizeAccount } from 'pl-fe/normalizers/account'; import toast from 'pl-fe/toast'; import type { Account, PaginatedResponse } from 'pl-api'; -import type { RootState } from 'pl-fe/store'; - -const EXPORT_FOLLOWS_REQUEST = 'EXPORT_FOLLOWS_REQUEST' as const; -const EXPORT_FOLLOWS_SUCCESS = 'EXPORT_FOLLOWS_SUCCESS' as const; -const EXPORT_FOLLOWS_FAIL = 'EXPORT_FOLLOWS_FAIL' as const; - -const EXPORT_BLOCKS_REQUEST = 'EXPORT_BLOCKS_REQUEST' as const; -const EXPORT_BLOCKS_SUCCESS = 'EXPORT_BLOCKS_SUCCESS' as const; -const EXPORT_BLOCKS_FAIL = 'EXPORT_BLOCKS_FAIL' as const; - -const EXPORT_MUTES_REQUEST = 'EXPORT_MUTES_REQUEST' as const; -const EXPORT_MUTES_SUCCESS = 'EXPORT_MUTES_SUCCESS' as const; -const EXPORT_MUTES_FAIL = 'EXPORT_MUTES_FAIL' as const; +import type { AppDispatch, RootState } from 'pl-fe/store'; const messages = defineMessages({ blocksSuccess: { id: 'export_data.success.blocks', defaultMessage: 'Blocks exported successfully' }, @@ -25,20 +13,6 @@ const messages = defineMessages({ mutesSuccess: { id: 'export_data.success.mutes', defaultMessage: 'Mutes exported successfully' }, }); -type ExportDataAction = { - type: typeof EXPORT_FOLLOWS_REQUEST - | typeof EXPORT_BLOCKS_REQUEST - | typeof EXPORT_MUTES_REQUEST - | typeof EXPORT_FOLLOWS_SUCCESS - | typeof EXPORT_BLOCKS_SUCCESS - | typeof EXPORT_MUTES_SUCCESS; -} | { - type: typeof EXPORT_FOLLOWS_FAIL - | typeof EXPORT_BLOCKS_FAIL - | typeof EXPORT_MUTES_FAIL; - error?: unknown; -} - const fileExport = (content: string, fileName: string) => { const fileToDownload = document.createElement('a'); @@ -62,8 +36,7 @@ const listAccounts = async (response: PaginatedResponse) => { return Array.from(new Set(accounts)); }; -const exportFollows = () => async (dispatch: React.Dispatch, getState: () => RootState) => { - dispatch({ type: EXPORT_FOLLOWS_REQUEST }); +const exportFollows = () => async (_dispatch: AppDispatch, getState: () => RootState) => { const me = getState().me; if (!me) return; @@ -75,52 +48,29 @@ const exportFollows = () => async (dispatch: React.Dispatch, g fileExport(followings.join('\n'), 'export_followings.csv'); toast.success(messages.followersSuccess); - dispatch({ type: EXPORT_FOLLOWS_SUCCESS }); - }).catch(error => { - dispatch({ type: EXPORT_FOLLOWS_FAIL, error }); }); }; -const exportBlocks = () => (dispatch: React.Dispatch, getState: () => RootState) => { - dispatch({ type: EXPORT_BLOCKS_REQUEST }); - return getClient(getState()).filtering.getBlocks({ limit: 40 }) +const exportBlocks = () => (_dispatch: AppDispatch, getState: () => RootState) => + getClient(getState()).filtering.getBlocks({ limit: 40 }) .then(listAccounts) .then((blocks) => { fileExport(blocks.join('\n'), 'export_block.csv'); toast.success(messages.blocksSuccess); - dispatch({ type: EXPORT_BLOCKS_SUCCESS }); - }).catch(error => { - dispatch({ type: EXPORT_BLOCKS_FAIL, error }); }); -}; -const exportMutes = () => (dispatch: React.Dispatch, getState: () => RootState) => { - dispatch({ type: EXPORT_MUTES_REQUEST }); - return getClient(getState()).filtering.getMutes({ limit: 40 }) +const exportMutes = () => (_dispatch: AppDispatch, getState: () => RootState) => + getClient(getState()).filtering.getMutes({ limit: 40 }) .then(listAccounts) .then((mutes) => { fileExport(mutes.join('\n'), 'export_mutes.csv'); toast.success(messages.mutesSuccess); - dispatch({ type: EXPORT_MUTES_SUCCESS }); - }).catch(error => { - dispatch({ type: EXPORT_MUTES_FAIL, error }); }); -}; export { - EXPORT_FOLLOWS_REQUEST, - EXPORT_FOLLOWS_SUCCESS, - EXPORT_FOLLOWS_FAIL, - EXPORT_BLOCKS_REQUEST, - EXPORT_BLOCKS_SUCCESS, - EXPORT_BLOCKS_FAIL, - EXPORT_MUTES_REQUEST, - EXPORT_MUTES_SUCCESS, - EXPORT_MUTES_FAIL, exportFollows, exportBlocks, exportMutes, - type ExportDataAction, }; diff --git a/packages/pl-fe/src/actions/external-auth.ts b/packages/pl-fe/src/actions/external-auth.ts index 14dc76f6d..2232873d0 100644 --- a/packages/pl-fe/src/actions/external-auth.ts +++ b/packages/pl-fe/src/actions/external-auth.ts @@ -46,7 +46,7 @@ const externalAuthorize = (instance: Instance, baseURL: string) => (dispatch: AppDispatch) => { const scopes = getInstanceScopes(instance); - return dispatch(createExternalApp(instance, baseURL)).then((app) => { + return createExternalApp(instance, baseURL).then((app) => { const { client_id, redirect_uri } = app; const query = new URLSearchParams({ @@ -88,7 +88,7 @@ const loginWithCode = (code: string) => code, }; - return dispatch(obtainOAuthToken(params, baseURL)) + return obtainOAuthToken(params, baseURL) .then((token) => dispatch(authLoggedIn(token))) .then(({ access_token }) => dispatch(verifyCredentials(access_token, baseURL))) .then((account) => dispatch(switchAccount(account.id))) diff --git a/packages/pl-fe/src/actions/familiar-followers.ts b/packages/pl-fe/src/actions/familiar-followers.ts deleted file mode 100644 index c651abcf6..000000000 --- a/packages/pl-fe/src/actions/familiar-followers.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { AppDispatch, RootState } from 'pl-fe/store'; - -import { getClient } from '../api'; - -import { fetchRelationships } from './accounts'; -import { importEntities } from './importer'; - -import type { Account } from 'pl-api'; - -const FAMILIAR_FOLLOWERS_FETCH_REQUEST = 'FAMILIAR_FOLLOWERS_FETCH_REQUEST' as const; -const FAMILIAR_FOLLOWERS_FETCH_SUCCESS = 'FAMILIAR_FOLLOWERS_FETCH_SUCCESS' as const; -const FAMILIAR_FOLLOWERS_FETCH_FAIL = 'FAMILIAR_FOLLOWERS_FETCH_FAIL' as const; - -const fetchAccountFamiliarFollowers = (accountId: string) => (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ - type: FAMILIAR_FOLLOWERS_FETCH_REQUEST, - accountId, - }); - - getClient(getState()).accounts.getFamiliarFollowers([accountId]) - .then((data) => { - const accounts = data.find(({ id }: { id: string }) => id === accountId)!.accounts; - - dispatch(importEntities({ accounts })); - dispatch(fetchRelationships(accounts.map((item) => item.id))); - dispatch({ - type: FAMILIAR_FOLLOWERS_FETCH_SUCCESS, - accountId, - accounts, - }); - }) - .catch(error => dispatch({ - type: FAMILIAR_FOLLOWERS_FETCH_FAIL, - accountId, - error, - skipAlert: true, - })); -}; - -type FamiliarFollowersAction = - | { - type: typeof FAMILIAR_FOLLOWERS_FETCH_REQUEST; - accountId: string; - } - | { - type: typeof FAMILIAR_FOLLOWERS_FETCH_SUCCESS; - accountId: string; - accounts: Array; - } - | { - type: typeof FAMILIAR_FOLLOWERS_FETCH_FAIL; - accountId: string; - error: unknown; - skipAlert: true; - } - -export { - FAMILIAR_FOLLOWERS_FETCH_REQUEST, - FAMILIAR_FOLLOWERS_FETCH_SUCCESS, - FAMILIAR_FOLLOWERS_FETCH_FAIL, - fetchAccountFamiliarFollowers, - type FamiliarFollowersAction, -}; diff --git a/packages/pl-fe/src/actions/filters.ts b/packages/pl-fe/src/actions/filters.ts index 21f4987a6..5d20b7d52 100644 --- a/packages/pl-fe/src/actions/filters.ts +++ b/packages/pl-fe/src/actions/filters.ts @@ -8,25 +8,7 @@ import { getClient } from '../api'; import type { Filter, FilterContext } from 'pl-api'; import type { AppDispatch, RootState } from 'pl-fe/store'; -const FILTERS_FETCH_REQUEST = 'FILTERS_FETCH_REQUEST' as const; const FILTERS_FETCH_SUCCESS = 'FILTERS_FETCH_SUCCESS' as const; -const FILTERS_FETCH_FAIL = 'FILTERS_FETCH_FAIL' as const; - -const FILTER_FETCH_REQUEST = 'FILTER_FETCH_REQUEST' as const; -const FILTER_FETCH_SUCCESS = 'FILTER_FETCH_SUCCESS' as const; -const FILTER_FETCH_FAIL = 'FILTER_FETCH_FAIL' as const; - -const FILTERS_CREATE_REQUEST = 'FILTERS_CREATE_REQUEST' as const; -const FILTERS_CREATE_SUCCESS = 'FILTERS_CREATE_SUCCESS' as const; -const FILTERS_CREATE_FAIL = 'FILTERS_CREATE_FAIL' as const; - -const FILTERS_UPDATE_REQUEST = 'FILTERS_UPDATE_REQUEST' as const; -const FILTERS_UPDATE_SUCCESS = 'FILTERS_UPDATE_SUCCESS' as const; -const FILTERS_UPDATE_FAIL = 'FILTERS_UPDATE_FAIL' as const; - -const FILTERS_DELETE_REQUEST = 'FILTERS_DELETE_REQUEST' as const; -const FILTERS_DELETE_SUCCESS = 'FILTERS_DELETE_SUCCESS' as const; -const FILTERS_DELETE_FAIL = 'FILTERS_DELETE_FAIL' as const; const messages = defineMessages({ added: { id: 'filters.added', defaultMessage: 'Filter added.' }, @@ -39,130 +21,59 @@ const fetchFilters = () => (dispatch: AppDispatch, getState: () => RootState) => { if (!isLoggedIn(getState)) return; - dispatch({ - type: FILTERS_FETCH_REQUEST, - }); - return getClient(getState).filtering.getFilters() - .then((data) => dispatch({ - type: FILTERS_FETCH_SUCCESS, + .then((data) => ({ filters: data, })) - .catch(error => dispatch({ - type: FILTERS_FETCH_FAIL, + .catch(error => ({ error, - skipAlert: true, })); }; const fetchFilter = (filterId: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: FILTER_FETCH_REQUEST }); - - return getClient(getState).filtering.getFilter(filterId) - .then((data) => { - dispatch({ - type: FILTER_FETCH_SUCCESS, - filter: data, - }); - - return data; - }) - .catch(error => { - dispatch({ - type: FILTER_FETCH_FAIL, - error, - skipAlert: true, - }); - }); - }; + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).filtering.getFilter(filterId); const createFilter = (title: string, expires_in: number | undefined, context: Array, hide: boolean, keywords_attributes: FilterKeywords) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: FILTERS_CREATE_REQUEST }); - - return getClient(getState).filtering.createFilter({ + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).filtering.createFilter({ title, context, filter_action: hide ? 'hide' : 'warn', expires_in, keywords_attributes, }).then(response => { - dispatch({ type: FILTERS_CREATE_SUCCESS, filter: response }); toast.success(messages.added); return response; - }).catch(error => { - dispatch({ type: FILTERS_CREATE_FAIL, error }); }); - }; const updateFilter = (filterId: string, title: string, expires_in: number | undefined, context: Array, hide: boolean, keywords_attributes: FilterKeywords) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: FILTERS_UPDATE_REQUEST }); - - return getClient(getState).filtering.updateFilter(filterId, { + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).filtering.updateFilter(filterId, { title, context, filter_action: hide ? 'hide' : 'warn', expires_in, keywords_attributes, }).then(response => { - dispatch({ type: FILTERS_UPDATE_SUCCESS, filter: response }); toast.success(messages.added); return response; - }).catch(error => { - dispatch({ type: FILTERS_UPDATE_FAIL, filterId, error }); }); - }; const deleteFilter = (filterId: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: FILTERS_DELETE_REQUEST }); - return getClient(getState).filtering.deleteFilter(filterId).then(response => { - dispatch({ type: FILTERS_DELETE_SUCCESS, filterId }); + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).filtering.deleteFilter(filterId).then(response => { toast.success(messages.removed); return response; - }).catch(error => { - dispatch({ type: FILTERS_DELETE_FAIL, filterId, error }); }); - }; -type FiltersAction = - | { type: typeof FILTERS_FETCH_REQUEST } - | { type: typeof FILTERS_FETCH_SUCCESS; filters: Array } - | { type: typeof FILTERS_FETCH_FAIL; error: unknown; skipAlert: true } - | { type: typeof FILTER_FETCH_REQUEST } - | { type: typeof FILTER_FETCH_SUCCESS; filter: Filter } - | { type: typeof FILTER_FETCH_FAIL; error: unknown; skipAlert: true } - | { type: typeof FILTERS_CREATE_REQUEST } - | { type: typeof FILTERS_CREATE_SUCCESS; filter: Filter } - | { type: typeof FILTERS_CREATE_FAIL; error: unknown } - | { type: typeof FILTERS_UPDATE_REQUEST } - | { type: typeof FILTERS_UPDATE_SUCCESS; filter: Filter } - | { type: typeof FILTERS_UPDATE_FAIL; filterId: string; error: unknown } - | { type: typeof FILTERS_DELETE_REQUEST } - | { type: typeof FILTERS_DELETE_SUCCESS; filterId: string } - | { type: typeof FILTERS_DELETE_FAIL; filterId: string; error: unknown } +type FiltersAction = { type: typeof FILTERS_FETCH_SUCCESS; filters: Array }; export { - FILTERS_FETCH_REQUEST, FILTERS_FETCH_SUCCESS, - FILTERS_FETCH_FAIL, - FILTER_FETCH_REQUEST, - FILTER_FETCH_SUCCESS, - FILTER_FETCH_FAIL, - FILTERS_CREATE_REQUEST, - FILTERS_CREATE_SUCCESS, - FILTERS_CREATE_FAIL, - FILTERS_UPDATE_REQUEST, - FILTERS_UPDATE_SUCCESS, - FILTERS_UPDATE_FAIL, - FILTERS_DELETE_REQUEST, - FILTERS_DELETE_SUCCESS, - FILTERS_DELETE_FAIL, fetchFilters, fetchFilter, createFilter, diff --git a/packages/pl-fe/src/actions/groups.ts b/packages/pl-fe/src/actions/groups.ts deleted file mode 100644 index a1cbb49df..000000000 --- a/packages/pl-fe/src/actions/groups.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { getClient } from '../api'; - -import { importEntities } from './importer'; - -import type { Account, PaginatedResponse } from 'pl-api'; -import type { AppDispatch, RootState } from 'pl-fe/store'; - -const GROUP_BLOCKS_FETCH_REQUEST = 'GROUP_BLOCKS_FETCH_REQUEST' as const; -const GROUP_BLOCKS_FETCH_SUCCESS = 'GROUP_BLOCKS_FETCH_SUCCESS' as const; -const GROUP_BLOCKS_FETCH_FAIL = 'GROUP_BLOCKS_FETCH_FAIL' as const; - -const GROUP_UNBLOCK_REQUEST = 'GROUP_UNBLOCK_REQUEST' as const; -const GROUP_UNBLOCK_SUCCESS = 'GROUP_UNBLOCK_SUCCESS' as const; -const GROUP_UNBLOCK_FAIL = 'GROUP_UNBLOCK_FAIL' as const; - -const groupKick = (groupId: string, accountId: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - return getClient(getState).experimental.groups.kickGroupUsers(groupId, [accountId]); - }; - -const fetchGroupBlocks = (groupId: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch(fetchGroupBlocksRequest(groupId)); - - return getClient(getState).experimental.groups.getGroupBlocks(groupId).then(response => { - dispatch(importEntities({ accounts: response.items })); - dispatch(fetchGroupBlocksSuccess(groupId, response.items, response.next)); - }).catch(error => { - dispatch(fetchGroupBlocksFail(groupId, error)); - }); - }; - -const fetchGroupBlocksRequest = (groupId: string) => ({ - type: GROUP_BLOCKS_FETCH_REQUEST, - groupId, -}); - -const fetchGroupBlocksSuccess = (groupId: string, accounts: Array, next: (() => Promise>) | null) => ({ - type: GROUP_BLOCKS_FETCH_SUCCESS, - groupId, - accounts, - next, -}); - -const fetchGroupBlocksFail = (groupId: string, error: unknown) => ({ - type: GROUP_BLOCKS_FETCH_FAIL, - groupId, - error, - skipNotFound: true, -}); - -const groupUnblock = (groupId: string, accountId: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch(groupUnblockRequest(groupId, accountId)); - - return getClient(getState).experimental.groups.unblockGroupUsers(groupId, [accountId]) - .then(() => dispatch(groupUnblockSuccess(groupId, accountId))) - .catch(err => dispatch(groupUnblockFail(groupId, accountId, err))); - }; - -const groupUnblockRequest = (groupId: string, accountId: string) => ({ - type: GROUP_UNBLOCK_REQUEST, - groupId, - accountId, -}); - -const groupUnblockSuccess = (groupId: string, accountId: string) => ({ - type: GROUP_UNBLOCK_SUCCESS, - groupId, - accountId, -}); - -const groupUnblockFail = (groupId: string, accountId: string, error: unknown) => ({ - type: GROUP_UNBLOCK_FAIL, - groupId, - accountId, - error, -}); - -type GroupsAction = - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - -export { - GROUP_BLOCKS_FETCH_REQUEST, - GROUP_BLOCKS_FETCH_SUCCESS, - GROUP_BLOCKS_FETCH_FAIL, - GROUP_UNBLOCK_REQUEST, - GROUP_UNBLOCK_SUCCESS, - GROUP_UNBLOCK_FAIL, - groupKick, - fetchGroupBlocks, - groupUnblock, - type GroupsAction, -}; diff --git a/packages/pl-fe/src/actions/import-data.ts b/packages/pl-fe/src/actions/import-data.ts index 1f991bfc7..fd9ddc1c3 100644 --- a/packages/pl-fe/src/actions/import-data.ts +++ b/packages/pl-fe/src/actions/import-data.ts @@ -4,35 +4,7 @@ import toast from 'pl-fe/toast'; import { getClient } from '../api'; -import type { RootState } from 'pl-fe/store'; - -const IMPORT_FOLLOWS_REQUEST = 'IMPORT_FOLLOWS_REQUEST' as const; -const IMPORT_FOLLOWS_SUCCESS = 'IMPORT_FOLLOWS_SUCCESS' as const; -const IMPORT_FOLLOWS_FAIL = 'IMPORT_FOLLOWS_FAIL' as const; - -const IMPORT_BLOCKS_REQUEST = 'IMPORT_BLOCKS_REQUEST' as const; -const IMPORT_BLOCKS_SUCCESS = 'IMPORT_BLOCKS_SUCCESS' as const; -const IMPORT_BLOCKS_FAIL = 'IMPORT_BLOCKS_FAIL' as const; - -const IMPORT_MUTES_REQUEST = 'IMPORT_MUTES_REQUEST' as const; -const IMPORT_MUTES_SUCCESS = 'IMPORT_MUTES_SUCCESS' as const; -const IMPORT_MUTES_FAIL = 'IMPORT_MUTES_FAIL' as const; - -type ImportDataActions = { - type: typeof IMPORT_FOLLOWS_REQUEST - | typeof IMPORT_BLOCKS_REQUEST - | typeof IMPORT_MUTES_REQUEST; -} | { - type: typeof IMPORT_FOLLOWS_SUCCESS - | typeof IMPORT_BLOCKS_SUCCESS - | typeof IMPORT_MUTES_SUCCESS; - response?: string; -} | { - type: | typeof IMPORT_FOLLOWS_FAIL - | typeof IMPORT_BLOCKS_FAIL - | typeof IMPORT_MUTES_FAIL; - error?: unknown; -} +import type { AppDispatch, RootState } from 'pl-fe/store'; const messages = defineMessages({ blocksSuccess: { id: 'import_data.success.blocks', defaultMessage: 'Blocks imported successfully' }, @@ -41,48 +13,24 @@ const messages = defineMessages({ }); const importFollows = (list: File | string, overwrite?: boolean) => - (dispatch: React.Dispatch, getState: () => RootState) => { - dispatch({ type: IMPORT_FOLLOWS_REQUEST }); - return getClient(getState).settings.importFollows(list, overwrite ? 'overwrite' : 'merge').then(response => { + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).settings.importFollows(list, overwrite ? 'overwrite' : 'merge').then(response => { toast.success(messages.followersSuccess); - dispatch({ type: IMPORT_FOLLOWS_SUCCESS, response }); - }).catch(error => { - dispatch({ type: IMPORT_FOLLOWS_FAIL, error }); }); - }; const importBlocks = (list: File | string, overwrite?: boolean) => - (dispatch: React.Dispatch, getState: () => RootState) => { - dispatch({ type: IMPORT_BLOCKS_REQUEST }); - return getClient(getState).settings.importBlocks(list, overwrite ? 'overwrite' : 'merge').then(response => { + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).settings.importBlocks(list, overwrite ? 'overwrite' : 'merge').then(response => { toast.success(messages.blocksSuccess); - dispatch({ type: IMPORT_BLOCKS_SUCCESS, response }); - }).catch(error => { - dispatch({ type: IMPORT_BLOCKS_FAIL, error }); }); - }; const importMutes = (list: File | string) => - (dispatch: React.Dispatch, getState: () => RootState) => { - dispatch({ type: IMPORT_MUTES_REQUEST }); - return getClient(getState).settings.importMutes(list).then(response => { + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).settings.importMutes(list).then(response => { toast.success(messages.mutesSuccess); - dispatch({ type: IMPORT_MUTES_SUCCESS, response }); - }).catch(error => { - dispatch({ type: IMPORT_MUTES_FAIL, error }); }); - }; export { - IMPORT_FOLLOWS_REQUEST, - IMPORT_FOLLOWS_SUCCESS, - IMPORT_FOLLOWS_FAIL, - IMPORT_BLOCKS_REQUEST, - IMPORT_BLOCKS_SUCCESS, - IMPORT_BLOCKS_FAIL, - IMPORT_MUTES_REQUEST, - IMPORT_MUTES_SUCCESS, - IMPORT_MUTES_FAIL, importFollows, importBlocks, importMutes, diff --git a/packages/pl-fe/src/actions/interactions.ts b/packages/pl-fe/src/actions/interactions.ts index 16cf7cdb0..7d2cf8b34 100644 --- a/packages/pl-fe/src/actions/interactions.ts +++ b/packages/pl-fe/src/actions/interactions.ts @@ -6,14 +6,12 @@ import { isLoggedIn } from 'pl-fe/utils/auth'; import { getClient } from '../api'; -import { fetchRelationships } from './accounts'; import { importEntities } from './importer'; -import type { Account, EmojiReaction, PaginatedResponse, Status } from 'pl-api'; +import type { Status } from 'pl-api'; import type { AppDispatch, RootState } from 'pl-fe/store'; const REBLOG_REQUEST = 'REBLOG_REQUEST' as const; -const REBLOG_SUCCESS = 'REBLOG_SUCCESS' as const; const REBLOG_FAIL = 'REBLOG_FAIL' as const; const FAVOURITE_REQUEST = 'FAVOURITE_REQUEST' as const; @@ -21,67 +19,26 @@ const FAVOURITE_SUCCESS = 'FAVOURITE_SUCCESS' as const; const FAVOURITE_FAIL = 'FAVOURITE_FAIL' as const; const DISLIKE_REQUEST = 'DISLIKE_REQUEST' as const; -const DISLIKE_SUCCESS = 'DISLIKE_SUCCESS' as const; const DISLIKE_FAIL = 'DISLIKE_FAIL' as const; const UNREBLOG_REQUEST = 'UNREBLOG_REQUEST' as const; -const UNREBLOG_SUCCESS = 'UNREBLOG_SUCCESS' as const; const UNREBLOG_FAIL = 'UNREBLOG_FAIL' as const; const UNFAVOURITE_REQUEST = 'UNFAVOURITE_REQUEST' as const; const UNFAVOURITE_SUCCESS = 'UNFAVOURITE_SUCCESS' as const; -const UNFAVOURITE_FAIL = 'UNFAVOURITE_FAIL' as const; const UNDISLIKE_REQUEST = 'UNDISLIKE_REQUEST' as const; -const UNDISLIKE_SUCCESS = 'UNDISLIKE_SUCCESS' as const; -const UNDISLIKE_FAIL = 'UNDISLIKE_FAIL' as const; -const REBLOGS_FETCH_REQUEST = 'REBLOGS_FETCH_REQUEST' as const; -const REBLOGS_FETCH_SUCCESS = 'REBLOGS_FETCH_SUCCESS' as const; -const REBLOGS_FETCH_FAIL = 'REBLOGS_FETCH_FAIL' as const; - -const FAVOURITES_FETCH_REQUEST = 'FAVOURITES_FETCH_REQUEST' as const; -const FAVOURITES_FETCH_SUCCESS = 'FAVOURITES_FETCH_SUCCESS' as const; -const FAVOURITES_FETCH_FAIL = 'FAVOURITES_FETCH_FAIL' as const; - -const DISLIKES_FETCH_REQUEST = 'DISLIKES_FETCH_REQUEST' as const; -const DISLIKES_FETCH_SUCCESS = 'DISLIKES_FETCH_SUCCESS' as const; -const DISLIKES_FETCH_FAIL = 'DISLIKES_FETCH_FAIL' as const; - -const REACTIONS_FETCH_REQUEST = 'REACTIONS_FETCH_REQUEST' as const; -const REACTIONS_FETCH_SUCCESS = 'REACTIONS_FETCH_SUCCESS' as const; -const REACTIONS_FETCH_FAIL = 'REACTIONS_FETCH_FAIL' as const; - -const PIN_REQUEST = 'PIN_REQUEST' as const; const PIN_SUCCESS = 'PIN_SUCCESS' as const; -const PIN_FAIL = 'PIN_FAIL' as const; -const UNPIN_REQUEST = 'UNPIN_REQUEST' as const; const UNPIN_SUCCESS = 'UNPIN_SUCCESS' as const; -const UNPIN_FAIL = 'UNPIN_FAIL' as const; -const BOOKMARK_REQUEST = 'BOOKMARK_REQUEST' as const; const BOOKMARK_SUCCESS = 'BOOKMARKED_SUCCESS' as const; -const BOOKMARK_FAIL = 'BOOKMARKED_FAIL' as const; -const UNBOOKMARK_REQUEST = 'UNBOOKMARKED_REQUEST' as const; const UNBOOKMARK_SUCCESS = 'UNBOOKMARKED_SUCCESS' as const; -const UNBOOKMARK_FAIL = 'UNBOOKMARKED_FAIL' as const; - -const REMOTE_INTERACTION_REQUEST = 'REMOTE_INTERACTION_REQUEST' as const; -const REMOTE_INTERACTION_SUCCESS = 'REMOTE_INTERACTION_SUCCESS' as const; -const REMOTE_INTERACTION_FAIL = 'REMOTE_INTERACTION_FAIL' as const; - -const FAVOURITES_EXPAND_SUCCESS = 'FAVOURITES_EXPAND_SUCCESS' as const; -const FAVOURITES_EXPAND_FAIL = 'FAVOURITES_EXPAND_FAIL' as const; - -const REBLOGS_EXPAND_SUCCESS = 'REBLOGS_EXPAND_SUCCESS' as const; -const REBLOGS_EXPAND_FAIL = 'REBLOGS_EXPAND_FAIL' as const; const noOp = () => new Promise(f => f(undefined)); -type AccountListLink = () => Promise>; - const messages = defineMessages({ bookmarkAdded: { id: 'status.bookmarked', defaultMessage: 'Bookmark added.' }, bookmarkRemoved: { id: 'status.unbookmarked', defaultMessage: 'Bookmark removed.' }, @@ -100,7 +57,6 @@ const reblog = (status: Pick) => // The reblog API method returns a new status wrapped around the original. In this case we are only // interested in how the original is modified, hence passing it skipping the wrapper if (response.reblog) dispatch(importEntities({ statuses: [response.reblog] })); - dispatch(reblogSuccess(response)); }).catch(error => { dispatch(reblogFail(status.id, error)); }); @@ -112,9 +68,7 @@ const unreblog = (status: Pick) => dispatch(unreblogRequest(status.id)); - return getClient(getState()).statuses.unreblogStatus(status.id).then((status) => { - dispatch(unreblogSuccess(status)); - }).catch(error => { + return getClient(getState()).statuses.unreblogStatus(status.id).catch(error => { dispatch(unreblogFail(status.id, error)); }); }; @@ -132,12 +86,6 @@ const reblogRequest = (statusId: string) => ({ statusId, }); -const reblogSuccess = (status: Status) => ({ - type: REBLOG_SUCCESS, - status, - statusId: status.id, -}); - const reblogFail = (statusId: string, error: unknown) => ({ type: REBLOG_FAIL, statusId, @@ -149,12 +97,6 @@ const unreblogRequest = (statusId: string) => ({ statusId, }); -const unreblogSuccess = (status: Status) => ({ - type: UNREBLOG_SUCCESS, - status, - statusId: status.id, -}); - const unreblogFail = (statusId: string, error: unknown) => ({ type: UNREBLOG_FAIL, statusId, @@ -182,8 +124,6 @@ const unfavourite = (status: Pick) => return getClient(getState()).statuses.unfavouriteStatus(status.id).then((response) => { dispatch(unfavouriteSuccess(response)); - }).catch(error => { - dispatch(unfavouriteFail(status.id, error)); }); }; @@ -223,21 +163,13 @@ const unfavouriteSuccess = (status: Status) => ({ statusId: status.id, }); -const unfavouriteFail = (statusId: string, error: unknown) => ({ - type: UNFAVOURITE_FAIL, - statusId, - error, -}); - const dislike = (status: Pick) => (dispatch: AppDispatch, getState: () => RootState) => { if (!isLoggedIn(getState)) return; dispatch(dislikeRequest(status.id)); - return getClient(getState).statuses.dislikeStatus(status.id).then((response) => { - dispatch(dislikeSuccess(response)); - }).catch((error) => { + return getClient(getState).statuses.dislikeStatus(status.id).catch((error) => { dispatch(dislikeFail(status.id, error)); }); }; @@ -248,11 +180,7 @@ const undislike = (status: Pick) => dispatch(undislikeRequest(status.id)); - return getClient(getState).statuses.undislikeStatus(status.id).then((response) => { - dispatch(undislikeSuccess(response)); - }).catch(error => { - dispatch(undislikeFail(status.id, error)); - }); + return getClient(getState).statuses.undislikeStatus(status.id); }; const toggleDislike = (status: Pick) => @@ -269,12 +197,6 @@ const dislikeRequest = (statusId: string) => ({ statusId, }); -const dislikeSuccess = (status: Status) => ({ - type: DISLIKE_SUCCESS, - status, - statusId: status.id, -}); - const dislikeFail = (statusId: string, error: unknown) => ({ type: DISLIKE_FAIL, statusId, @@ -286,26 +208,12 @@ const undislikeRequest = (statusId: string) => ({ statusId, }); -const undislikeSuccess = (status: Status) => ({ - type: UNDISLIKE_SUCCESS, - status, - statusId: status.id, -}); - -const undislikeFail = (statusId: string, error: unknown) => ({ - type: UNDISLIKE_FAIL, - statusId, - error, -}); - const bookmark = (status: Pick, folderId?: string) => (dispatch: AppDispatch, getState: () => RootState) => { const state = getState(); const features = state.auth.client.features; - dispatch(bookmarkRequest(status.id)); - return getClient(getState()).statuses.bookmarkStatus(status.id, folderId).then((response) => { dispatch(importEntities({ statuses: [response] })); dispatch(bookmarkSuccess(response)); @@ -325,23 +233,16 @@ const bookmark = (status: Pick, folderId?: string) => } toast.success(typeof folderId === 'string' ? messages.folderChanged : messages.bookmarkAdded, opts); - }).catch((error) => { - dispatch(bookmarkFail(status.id, error)); }); }; const unbookmark = (status: Pick) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch(unbookmarkRequest(status.id)); - - return getClient(getState()).statuses.unbookmarkStatus(status.id).then(response => { + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).statuses.unbookmarkStatus(status.id).then(response => { dispatch(importEntities({ statuses: [response] })); dispatch(unbookmarkSuccess(response)); toast.success(messages.bookmarkRemoved); - }).catch(error => { - dispatch(unbookmarkFail(status.id, error)); }); - }; const toggleBookmark = (status: Pick) => (dispatch: AppDispatch) => { @@ -352,229 +253,29 @@ const toggleBookmark = (status: Pick) => } }; -const bookmarkRequest = (statusId: string) => ({ - type: BOOKMARK_REQUEST, - statusId, -}); - const bookmarkSuccess = (status: Status) => ({ type: BOOKMARK_SUCCESS, status, statusId: status.id, }); -const bookmarkFail = (statusId: string, error: unknown) => ({ - type: BOOKMARK_FAIL, - statusId, - error, -}); - -const unbookmarkRequest = (statusId: string) => ({ - type: UNBOOKMARK_REQUEST, - statusId, -}); - const unbookmarkSuccess = (status: Status) => ({ type: UNBOOKMARK_SUCCESS, status, statusId: status.id, }); -const unbookmarkFail = (statusId: string, error: unknown) => ({ - type: UNBOOKMARK_FAIL, - statusId, - error, -}); - -const fetchReblogs = (statusId: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch(fetchReblogsRequest(statusId)); - - return getClient(getState()).statuses.getRebloggedBy(statusId).then(response => { - dispatch(importEntities({ accounts: response.items })); - dispatch(fetchRelationships(response.items.map((item) => item.id))); - dispatch(fetchReblogsSuccess(statusId, response.items, response.next)); - }).catch(error => { - dispatch(fetchReblogsFail(statusId, error)); - }); - }; - -const fetchReblogsRequest = (statusId: string) => ({ - type: REBLOGS_FETCH_REQUEST, - statusId, -}); - -const fetchReblogsSuccess = (statusId: string, accounts: Array, next: AccountListLink | null) => ({ - type: REBLOGS_FETCH_SUCCESS, - statusId, - accounts, - next, -}); - -const fetchReblogsFail = (statusId: string, error: unknown) => ({ - type: REBLOGS_FETCH_FAIL, - statusId, - error, -}); - -const expandReblogs = (statusId: string, next: AccountListLink) => - (dispatch: AppDispatch, getState: () => RootState) => { - next().then(response => { - dispatch(importEntities({ accounts: response.items })); - dispatch(fetchRelationships(response.items.map((item) => item.id))); - dispatch(expandReblogsSuccess(statusId, response.items, response.next)); - }).catch(error => { - dispatch(expandReblogsFail(statusId, error)); - }); - }; - -const expandReblogsSuccess = (statusId: string, accounts: Array, next: AccountListLink | null) => ({ - type: REBLOGS_EXPAND_SUCCESS, - statusId, - accounts, - next, -}); - -const expandReblogsFail = (statusId: string, error: unknown) => ({ - type: REBLOGS_EXPAND_FAIL, - statusId, - error, -}); - -const fetchFavourites = (statusId: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch(fetchFavouritesRequest(statusId)); - - return getClient(getState()).statuses.getFavouritedBy(statusId).then(response => { - dispatch(importEntities({ accounts: response.items })); - dispatch(fetchRelationships(response.items.map((item) => item.id))); - dispatch(fetchFavouritesSuccess(statusId, response.items, response.next)); - }).catch(error => { - dispatch(fetchFavouritesFail(statusId, error)); - }); - }; - -const fetchFavouritesRequest = (statusId: string) => ({ - type: FAVOURITES_FETCH_REQUEST, - statusId, -}); - -const fetchFavouritesSuccess = (statusId: string, accounts: Array, next: AccountListLink | null) => ({ - type: FAVOURITES_FETCH_SUCCESS, - statusId, - accounts, - next, -}); - -const fetchFavouritesFail = (statusId: string, error: unknown) => ({ - type: FAVOURITES_FETCH_FAIL, - statusId, - error, -}); - -const expandFavourites = (statusId: string, next: AccountListLink) => - (dispatch: AppDispatch) => { - next().then(response => { - dispatch(importEntities({ accounts: response.items })); - dispatch(fetchRelationships(response.items.map((item) => item.id))); - dispatch(expandFavouritesSuccess(statusId, response.items, response.next)); - }).catch(error => { - dispatch(expandFavouritesFail(statusId, error)); - }); - }; - -const expandFavouritesSuccess = (statusId: string, accounts: Array, next: AccountListLink | null) => ({ - type: FAVOURITES_EXPAND_SUCCESS, - statusId, - accounts, - next, -}); - -const expandFavouritesFail = (statusId: string, error: unknown) => ({ - type: FAVOURITES_EXPAND_FAIL, - statusId, - error, -}); - -const fetchDislikes = (statusId: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch(fetchDislikesRequest(statusId)); - - return getClient(getState).statuses.getDislikedBy(statusId).then(response => { - dispatch(importEntities({ accounts: response })); - dispatch(fetchRelationships(response.map((item) => item.id))); - dispatch(fetchDislikesSuccess(statusId, response)); - }).catch(error => { - dispatch(fetchDislikesFail(statusId, error)); - }); - }; - -const fetchDislikesRequest = (statusId: string) => ({ - type: DISLIKES_FETCH_REQUEST, - statusId, -}); - -const fetchDislikesSuccess = (statusId: string, accounts: Array) => ({ - type: DISLIKES_FETCH_SUCCESS, - statusId, - accounts, -}); - -const fetchDislikesFail = (statusId: string, error: unknown) => ({ - type: DISLIKES_FETCH_FAIL, - statusId, - error, -}); - -const fetchReactions = (statusId: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch(fetchReactionsRequest(statusId)); - - return getClient(getState).statuses.getStatusReactions(statusId).then(response => { - dispatch(importEntities({ accounts: (response).map(({ accounts }) => accounts).flat() })); - dispatch(fetchReactionsSuccess(statusId, response)); - }).catch(error => { - dispatch(fetchReactionsFail(statusId, error)); - }); - }; - -const fetchReactionsRequest = (statusId: string) => ({ - type: REACTIONS_FETCH_REQUEST, - statusId, -}); - -const fetchReactionsSuccess = (statusId: string, reactions: EmojiReaction[]) => ({ - type: REACTIONS_FETCH_SUCCESS, - statusId, - reactions, -}); - -const fetchReactionsFail = (statusId: string, error: unknown) => ({ - type: REACTIONS_FETCH_FAIL, - statusId, - error, -}); - const pin = (status: Pick, accountId: string) => (dispatch: AppDispatch, getState: () => RootState) => { if (!isLoggedIn(getState)) return; - dispatch(pinRequest(status.id, accountId)); - return getClient(getState()).statuses.pinStatus(status.id).then(response => { dispatch(importEntities({ statuses: [response] })); dispatch(pinSuccess(response, accountId)); }).catch(error => { - dispatch(pinFail(status.id, error, accountId)); }); }; -const pinRequest = (statusId: string, accountId: string) => ({ - type: PIN_REQUEST, - statusId, - accountId, -}); - const pinSuccess = (status: Status, accountId: string) => ({ type: PIN_SUCCESS, status, @@ -582,24 +283,13 @@ const pinSuccess = (status: Status, accountId: string) => ({ accountId, }); -const pinFail = (statusId: string, error: unknown, accountId: string) => ({ - type: PIN_FAIL, - statusId, - error, - accountId, -}); - const unpin = (status: Pick, accountId: string) => (dispatch: AppDispatch, getState: () => RootState) => { if (!isLoggedIn(getState)) return; - dispatch(unpinRequest(status.id, accountId)); - return getClient(getState()).statuses.unpinStatus(status.id).then(response => { dispatch(importEntities({ statuses: [response] })); dispatch(unpinSuccess(response, accountId)); - }).catch(error => { - dispatch(unpinFail(status.id, error, accountId)); }); }; @@ -616,12 +306,6 @@ const togglePin = (status: Pick) => } }; -const unpinRequest = (statusId: string, accountId: string) => ({ - type: UNPIN_REQUEST, - statusId, - accountId, -}); - const unpinSuccess = (status: Status, accountId: string) => ({ type: UNPIN_SUCCESS, status, @@ -629,168 +313,54 @@ const unpinSuccess = (status: Status, accountId: string) => ({ accountId, }); -const unpinFail = (statusId: string, error: unknown, accountId: string) => ({ - type: UNPIN_FAIL, - statusId, - error, - accountId, -}); - const remoteInteraction = (ap_id: string, profile: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch(remoteInteractionRequest(ap_id, profile)); - - return getClient(getState).accounts.remoteInteraction(ap_id, profile).then((data) => { - dispatch(remoteInteractionSuccess(ap_id, profile, data.url)); - - return data.url; - }).catch(error => { - dispatch(remoteInteractionFail(ap_id, profile, error)); - throw error; - }); - }; - -const remoteInteractionRequest = (ap_id: string, profile: string) => ({ - type: REMOTE_INTERACTION_REQUEST, - ap_id, - profile, -}); - -const remoteInteractionSuccess = (ap_id: string, profile: string, url: string) => ({ - type: REMOTE_INTERACTION_SUCCESS, - ap_id, - profile, - url, -}); - -const remoteInteractionFail = (ap_id: string, profile: string, error: unknown) => ({ - type: REMOTE_INTERACTION_FAIL, - ap_id, - profile, - error, -}); + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).accounts.remoteInteraction(ap_id, profile).then((data) => data.url); type InteractionsAction = - ReturnType - | ReturnType + | ReturnType | ReturnType | ReturnType - | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType - | ReturnType | ReturnType - | ReturnType | ReturnType | ReturnType - | ReturnType - | ReturnType - | ReturnType | ReturnType - | ReturnType - | ReturnType | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType | ReturnType - | ReturnType - | ReturnType | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType; export { REBLOG_REQUEST, - REBLOG_SUCCESS, REBLOG_FAIL, FAVOURITE_REQUEST, FAVOURITE_SUCCESS, FAVOURITE_FAIL, DISLIKE_REQUEST, - DISLIKE_SUCCESS, DISLIKE_FAIL, UNREBLOG_REQUEST, - UNREBLOG_SUCCESS, UNREBLOG_FAIL, UNFAVOURITE_REQUEST, UNFAVOURITE_SUCCESS, - UNFAVOURITE_FAIL, UNDISLIKE_REQUEST, - UNDISLIKE_SUCCESS, - UNDISLIKE_FAIL, - REBLOGS_FETCH_REQUEST, - REBLOGS_FETCH_SUCCESS, - REBLOGS_FETCH_FAIL, - FAVOURITES_FETCH_REQUEST, - FAVOURITES_FETCH_SUCCESS, - FAVOURITES_FETCH_FAIL, - DISLIKES_FETCH_REQUEST, - DISLIKES_FETCH_SUCCESS, - DISLIKES_FETCH_FAIL, - REACTIONS_FETCH_REQUEST, - REACTIONS_FETCH_SUCCESS, - REACTIONS_FETCH_FAIL, - PIN_REQUEST, PIN_SUCCESS, - PIN_FAIL, - UNPIN_REQUEST, UNPIN_SUCCESS, - UNPIN_FAIL, - BOOKMARK_REQUEST, BOOKMARK_SUCCESS, - BOOKMARK_FAIL, - UNBOOKMARK_REQUEST, UNBOOKMARK_SUCCESS, - UNBOOKMARK_FAIL, - REMOTE_INTERACTION_REQUEST, - REMOTE_INTERACTION_SUCCESS, - REMOTE_INTERACTION_FAIL, - FAVOURITES_EXPAND_SUCCESS, - FAVOURITES_EXPAND_FAIL, - REBLOGS_EXPAND_SUCCESS, - REBLOGS_EXPAND_FAIL, reblog, unreblog, toggleReblog, favourite, unfavourite, toggleFavourite, - dislike, - undislike, toggleDislike, bookmark, - unbookmark, toggleBookmark, - fetchReblogs, - expandReblogs, - fetchFavourites, - expandFavourites, - fetchDislikes, - fetchReactions, - pin, - unpin, togglePin, remoteInteraction, type InteractionsAction, diff --git a/packages/pl-fe/src/actions/languages.ts b/packages/pl-fe/src/actions/languages.ts deleted file mode 100644 index fe26a5345..000000000 --- a/packages/pl-fe/src/actions/languages.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { saveSettings } from './settings'; - -import type { AppDispatch } from 'pl-fe/store'; - -const LANGUAGE_USE = 'LANGUAGE_USE' as const; - -const rememberLanguageUse = (language: string) => (dispatch: AppDispatch) => { - dispatch({ - type: LANGUAGE_USE, - language, - }); - - dispatch(saveSettings()); -}; - -export { LANGUAGE_USE, rememberLanguageUse }; diff --git a/packages/pl-fe/src/actions/lists.ts b/packages/pl-fe/src/actions/lists.ts index 463f151c5..8a64992a6 100644 --- a/packages/pl-fe/src/actions/lists.ts +++ b/packages/pl-fe/src/actions/lists.ts @@ -9,13 +9,10 @@ import { importEntities } from './importer'; import type { Account, List, PaginatedResponse } from 'pl-api'; import type { AppDispatch, RootState } from 'pl-fe/store'; -const LIST_FETCH_REQUEST = 'LIST_FETCH_REQUEST' as const; const LIST_FETCH_SUCCESS = 'LIST_FETCH_SUCCESS' as const; const LIST_FETCH_FAIL = 'LIST_FETCH_FAIL' as const; -const LISTS_FETCH_REQUEST = 'LISTS_FETCH_REQUEST' as const; const LISTS_FETCH_SUCCESS = 'LISTS_FETCH_SUCCESS' as const; -const LISTS_FETCH_FAIL = 'LISTS_FETCH_FAIL' as const; const LIST_EDITOR_TITLE_CHANGE = 'LIST_EDITOR_TITLE_CHANGE' as const; const LIST_EDITOR_RESET = 'LIST_EDITOR_RESET' as const; @@ -29,9 +26,7 @@ const LIST_UPDATE_REQUEST = 'LIST_UPDATE_REQUEST' as const; const LIST_UPDATE_SUCCESS = 'LIST_UPDATE_SUCCESS' as const; const LIST_UPDATE_FAIL = 'LIST_UPDATE_FAIL' as const; -const LIST_DELETE_REQUEST = 'LIST_DELETE_REQUEST' as const; const LIST_DELETE_SUCCESS = 'LIST_DELETE_SUCCESS' as const; -const LIST_DELETE_FAIL = 'LIST_DELETE_FAIL' as const; const LIST_ACCOUNTS_FETCH_REQUEST = 'LIST_ACCOUNTS_FETCH_REQUEST' as const; const LIST_ACCOUNTS_FETCH_SUCCESS = 'LIST_ACCOUNTS_FETCH_SUCCESS' as const; @@ -41,13 +36,9 @@ const LIST_EDITOR_SUGGESTIONS_CHANGE = 'LIST_EDITOR_SUGGESTIONS_CHANGE' as const const LIST_EDITOR_SUGGESTIONS_READY = 'LIST_EDITOR_SUGGESTIONS_READY' as const; const LIST_EDITOR_SUGGESTIONS_CLEAR = 'LIST_EDITOR_SUGGESTIONS_CLEAR' as const; -const LIST_EDITOR_ADD_REQUEST = 'LIST_EDITOR_ADD_REQUEST' as const; const LIST_EDITOR_ADD_SUCCESS = 'LIST_EDITOR_ADD_SUCCESS' as const; -const LIST_EDITOR_ADD_FAIL = 'LIST_EDITOR_ADD_FAIL' as const; -const LIST_EDITOR_REMOVE_REQUEST = 'LIST_EDITOR_REMOVE_REQUEST' as const; const LIST_EDITOR_REMOVE_SUCCESS = 'LIST_EDITOR_REMOVE_SUCCESS' as const; -const LIST_EDITOR_REMOVE_FAIL = 'LIST_EDITOR_REMOVE_FAIL' as const; const LIST_ADDER_RESET = 'LIST_ADDER_RESET' as const; const LIST_ADDER_SETUP = 'LIST_ADDER_SETUP' as const; @@ -63,18 +54,11 @@ const fetchList = (listId: string) => (dispatch: AppDispatch, getState: () => Ro return; } - dispatch(fetchListRequest(listId)); - return getClient(getState()).lists.getList(listId) .then((data) => dispatch(fetchListSuccess(data))) .catch(err => dispatch(fetchListFail(listId, err))); }; -const fetchListRequest = (listId: string) => ({ - type: LIST_FETCH_REQUEST, - listId, -}); - const fetchListSuccess = (list: List) => ({ type: LIST_FETCH_SUCCESS, list, @@ -89,27 +73,15 @@ const fetchListFail = (listId: string, error: unknown) => ({ const fetchLists = () => (dispatch: AppDispatch, getState: () => RootState) => { if (!isLoggedIn(getState)) return; - dispatch(fetchListsRequest()); - return getClient(getState()).lists.getLists() - .then((data) => dispatch(fetchListsSuccess(data))) - .catch(err => dispatch(fetchListsFail(err))); + .then((data) => dispatch(fetchListsSuccess(data))); }; -const fetchListsRequest = () => ({ - type: LISTS_FETCH_REQUEST, -}); - const fetchListsSuccess = (lists: Array) => ({ type: LISTS_FETCH_SUCCESS, lists, }); -const fetchListsFail = (error: unknown) => ({ - type: LISTS_FETCH_FAIL, - error, -}); - const submitListEditor = (shouldReset?: boolean) => (dispatch: AppDispatch, getState: () => RootState) => { const listId = getState().listEditor.listId!; const title = getState().listEditor.title; @@ -208,29 +180,15 @@ const resetListEditor = () => ({ const deleteList = (listId: string) => (dispatch: AppDispatch, getState: () => RootState) => { if (!isLoggedIn(getState)) return; - dispatch(deleteListRequest(listId)); - return getClient(getState()).lists.deleteList(listId) - .then(() => dispatch(deleteListSuccess(listId))) - .catch(err => dispatch(deleteListFail(listId, err))); + .then(() => dispatch(deleteListSuccess(listId))); }; -const deleteListRequest = (listId: string) => ({ - type: LIST_DELETE_REQUEST, - listId, -}); - const deleteListSuccess = (listId: string) => ({ type: LIST_DELETE_SUCCESS, listId, }); -const deleteListFail = (listId: string, error: unknown) => ({ - type: LIST_DELETE_FAIL, - listId, - error, -}); - const fetchListAccounts = (listId: string) => (dispatch: AppDispatch, getState: () => RootState) => { if (!isLoggedIn(getState)) return; @@ -291,32 +249,16 @@ const addToListEditor = (accountId: string) => (dispatch: AppDispatch, getState: const addToList = (listId: string, accountId: string) => (dispatch: AppDispatch, getState: () => RootState) => { if (!isLoggedIn(getState)) return; - dispatch(addToListRequest(listId, accountId)); - return getClient(getState()).lists.addListAccounts(listId, [accountId]) - .then(() => dispatch(addToListSuccess(listId, accountId))) - .catch(err => dispatch(addToListFail(listId, accountId, err))); + .then(() => dispatch(addToListSuccess(listId, accountId))); }; -const addToListRequest = (listId: string, accountId: string) => ({ - type: LIST_EDITOR_ADD_REQUEST, - listId, - accountId, -}); - const addToListSuccess = (listId: string, accountId: string) => ({ type: LIST_EDITOR_ADD_SUCCESS, listId, accountId, }); -const addToListFail = (listId: string, accountId: string, error: unknown) => ({ - type: LIST_EDITOR_ADD_FAIL, - listId, - accountId, - error, -}); - const removeFromListEditor = (accountId: string) => (dispatch: AppDispatch, getState: () => RootState) => { dispatch(removeFromList(getState().listEditor.listId!, accountId)); }; @@ -324,31 +266,16 @@ const removeFromListEditor = (accountId: string) => (dispatch: AppDispatch, getS const removeFromList = (listId: string, accountId: string) => (dispatch: AppDispatch, getState: () => RootState) => { if (!isLoggedIn(getState)) return; - dispatch(removeFromListRequest(listId, accountId)); - return getClient(getState()).lists.deleteListAccounts(listId, [accountId]) - .then(() => dispatch(removeFromListSuccess(listId, accountId))) - .catch(err => dispatch(removeFromListFail(listId, accountId, err))); + .then(() => dispatch(removeFromListSuccess(listId, accountId))); }; -const removeFromListRequest = (listId: string, accountId: string) => ({ - type: LIST_EDITOR_REMOVE_REQUEST, - listId, - accountId, -}); - const removeFromListSuccess = (listId: string, accountId: string) => ({ type: LIST_EDITOR_REMOVE_SUCCESS, listId, accountId, }); -const removeFromListFail = (listId: string, accountId: string, error: unknown) => ({ - type: LIST_EDITOR_REMOVE_FAIL, - listId, - accountId, - error, -}); const resetListAdder = () => ({ type: LIST_ADDER_RESET, @@ -407,12 +334,9 @@ const removeFromListAdder = (listId: string) => (dispatch: AppDispatch, getState }; type ListsAction = - | ReturnType | ReturnType | ReturnType - | ReturnType | ReturnType - | ReturnType | ListEditorSetupAction | ReturnType | ReturnType @@ -422,21 +346,15 @@ type ListsAction = | ReturnType | ReturnType | ReturnType - | ReturnType | ReturnType - | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType - | ReturnType | ReturnType - | ReturnType - | ReturnType | ReturnType - | ReturnType | ReturnType | ListAdderSetupAction | ReturnType @@ -444,12 +362,9 @@ type ListsAction = | ReturnType; export { - LIST_FETCH_REQUEST, LIST_FETCH_SUCCESS, LIST_FETCH_FAIL, - LISTS_FETCH_REQUEST, LISTS_FETCH_SUCCESS, - LISTS_FETCH_FAIL, LIST_EDITOR_TITLE_CHANGE, LIST_EDITOR_RESET, LIST_EDITOR_SETUP, @@ -459,21 +374,15 @@ export { LIST_UPDATE_REQUEST, LIST_UPDATE_SUCCESS, LIST_UPDATE_FAIL, - LIST_DELETE_REQUEST, LIST_DELETE_SUCCESS, - LIST_DELETE_FAIL, LIST_ACCOUNTS_FETCH_REQUEST, LIST_ACCOUNTS_FETCH_SUCCESS, LIST_ACCOUNTS_FETCH_FAIL, LIST_EDITOR_SUGGESTIONS_CHANGE, LIST_EDITOR_SUGGESTIONS_READY, LIST_EDITOR_SUGGESTIONS_CLEAR, - LIST_EDITOR_ADD_REQUEST, LIST_EDITOR_ADD_SUCCESS, - LIST_EDITOR_ADD_FAIL, - LIST_EDITOR_REMOVE_REQUEST, LIST_EDITOR_REMOVE_SUCCESS, - LIST_EDITOR_REMOVE_FAIL, LIST_ADDER_RESET, LIST_ADDER_SETUP, LIST_ADDER_LISTS_FETCH_REQUEST, @@ -484,22 +393,15 @@ export { submitListEditor, setupListEditor, changeListEditorTitle, - createList, - updateList, resetListEditor, deleteList, - fetchListAccounts, fetchListSuggestions, - fetchListSuggestionsReady, clearListSuggestions, changeListSuggestions, addToListEditor, - addToList, removeFromListEditor, - removeFromList, resetListAdder, setupListAdder, - fetchAccountLists, addToListAdder, removeFromListAdder, type ListsAction, diff --git a/packages/pl-fe/src/actions/markers.ts b/packages/pl-fe/src/actions/markers.ts index 4941ffa89..ce16d6a35 100644 --- a/packages/pl-fe/src/actions/markers.ts +++ b/packages/pl-fe/src/actions/markers.ts @@ -3,66 +3,35 @@ import { getClient } from '../api'; import type { Markers, SaveMarkersParams } from 'pl-api'; import type { AppDispatch, RootState } from 'pl-fe/store'; -const MARKER_FETCH_REQUEST = 'MARKER_FETCH_REQUEST' as const; const MARKER_FETCH_SUCCESS = 'MARKER_FETCH_SUCCESS' as const; -const MARKER_FETCH_FAIL = 'MARKER_FETCH_FAIL' as const; -const MARKER_SAVE_REQUEST = 'MARKER_SAVE_REQUEST' as const; const MARKER_SAVE_SUCCESS = 'MARKER_SAVE_SUCCESS' as const; -const MARKER_SAVE_FAIL = 'MARKER_SAVE_FAIL' as const; const fetchMarker = (timeline: Array) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: MARKER_FETCH_REQUEST }); - return getClient(getState).timelines.getMarkers(timeline).then((marker) => { + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).timelines.getMarkers(timeline).then((marker) => { dispatch({ type: MARKER_FETCH_SUCCESS, marker }); - }).catch(error => { - dispatch({ type: MARKER_FETCH_FAIL, error }); }); - }; const saveMarker = (marker: SaveMarkersParams) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: MARKER_SAVE_REQUEST, marker }); - return getClient(getState).timelines.saveMarkers(marker).then((marker) => { + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).timelines.saveMarkers(marker).then((marker) => { dispatch({ type: MARKER_SAVE_SUCCESS, marker }); - }).catch(error => { - dispatch({ type: MARKER_SAVE_FAIL, error }); }); - }; type MarkersAction = - | { - type: typeof MARKER_FETCH_REQUEST; - } | { type: typeof MARKER_FETCH_SUCCESS; marker: Markers; } - | { - type: typeof MARKER_FETCH_FAIL; - error: unknown; - } - | { - type: typeof MARKER_SAVE_REQUEST; - marker: SaveMarkersParams; - } | { type: typeof MARKER_SAVE_SUCCESS; marker: Markers; - } - | { - type: typeof MARKER_SAVE_FAIL; - error: unknown; - } + }; export { - MARKER_FETCH_REQUEST, MARKER_FETCH_SUCCESS, - MARKER_FETCH_FAIL, - MARKER_SAVE_REQUEST, MARKER_SAVE_SUCCESS, - MARKER_SAVE_FAIL, fetchMarker, saveMarker, type MarkersAction, diff --git a/packages/pl-fe/src/actions/me.ts b/packages/pl-fe/src/actions/me.ts index e33e44955..a90874cfc 100644 --- a/packages/pl-fe/src/actions/me.ts +++ b/packages/pl-fe/src/actions/me.ts @@ -13,14 +13,11 @@ import { FE_NAME } from './settings'; import type { CredentialAccount, UpdateCredentialsParams } from 'pl-api'; import type { AppDispatch, RootState } from 'pl-fe/store'; -const ME_FETCH_REQUEST = 'ME_FETCH_REQUEST' as const; const ME_FETCH_SUCCESS = 'ME_FETCH_SUCCESS' as const; const ME_FETCH_FAIL = 'ME_FETCH_FAIL' as const; const ME_FETCH_SKIP = 'ME_FETCH_SKIP' as const; -const ME_PATCH_REQUEST = 'ME_PATCH_REQUEST' as const; const ME_PATCH_SUCCESS = 'ME_PATCH_SUCCESS' as const; -const ME_PATCH_FAIL = 'ME_PATCH_FAIL' as const; const noOp = () => new Promise(f => f(undefined)); @@ -54,7 +51,6 @@ const fetchMe = () => return noOp(); } - dispatch(fetchMeRequest()); return dispatch(loadCredentials(token, accountUrl!)) .catch(error => dispatch(fetchMeFail(error))); }; @@ -81,22 +77,12 @@ const persistAuthAccount = (account: CredentialAccount, params: Record - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch(patchMeRequest()); - - return getClient(getState).settings.updateCredentials(params) + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).settings.updateCredentials(params) .then(response => { persistAuthAccount(response, params); dispatch(patchMeSuccess(response)); - }).catch(error => { - dispatch(patchMeFail(error)); - throw error; }); - }; - -const fetchMeRequest = () => ({ - type: ME_FETCH_REQUEST, -}); const fetchMeSuccess = (account: CredentialAccount) => { setSentryAccount(account); @@ -115,10 +101,6 @@ const fetchMeFail = (error: unknown) => ({ skipAlert: true, }); -const patchMeRequest = () => ({ - type: ME_PATCH_REQUEST, -}); - interface MePatchSuccessAction { type: typeof ME_PATCH_SUCCESS; me: CredentialAccount; @@ -133,29 +115,17 @@ const patchMeSuccess = (me: CredentialAccount) => }); }; -const patchMeFail = (error: unknown) => ({ - type: ME_PATCH_FAIL, - error, - skipAlert: true, -}); - type MeAction = - | ReturnType | ReturnType | ReturnType | MeFetchSkipAction - | ReturnType | MePatchSuccessAction - | ReturnType; export { - ME_FETCH_REQUEST, ME_FETCH_SUCCESS, ME_FETCH_FAIL, ME_FETCH_SKIP, - ME_PATCH_REQUEST, ME_PATCH_SUCCESS, - ME_PATCH_FAIL, fetchMe, patchMe, fetchMeSuccess, diff --git a/packages/pl-fe/src/actions/mfa.ts b/packages/pl-fe/src/actions/mfa.ts index 94f3d97b9..6cb33a273 100644 --- a/packages/pl-fe/src/actions/mfa.ts +++ b/packages/pl-fe/src/actions/mfa.ts @@ -3,117 +3,49 @@ import { getClient } from '../api'; import type { PlApiClient } from 'pl-api'; import type { AppDispatch, RootState } from 'pl-fe/store'; -const MFA_FETCH_REQUEST = 'MFA_FETCH_REQUEST' as const; const MFA_FETCH_SUCCESS = 'MFA_FETCH_SUCCESS' as const; -const MFA_FETCH_FAIL = 'MFA_FETCH_FAIL' as const; -const MFA_BACKUP_CODES_FETCH_REQUEST = 'MFA_BACKUP_CODES_FETCH_REQUEST' as const; -const MFA_BACKUP_CODES_FETCH_SUCCESS = 'MFA_BACKUP_CODES_FETCH_SUCCESS' as const; -const MFA_BACKUP_CODES_FETCH_FAIL = 'MFA_BACKUP_CODES_FETCH_FAIL' as const; - -const MFA_SETUP_REQUEST = 'MFA_SETUP_REQUEST' as const; -const MFA_SETUP_SUCCESS = 'MFA_SETUP_SUCCESS' as const; -const MFA_SETUP_FAIL = 'MFA_SETUP_FAIL' as const; - -const MFA_CONFIRM_REQUEST = 'MFA_CONFIRM_REQUEST' as const; const MFA_CONFIRM_SUCCESS = 'MFA_CONFIRM_SUCCESS' as const; -const MFA_CONFIRM_FAIL = 'MFA_CONFIRM_FAIL' as const; -const MFA_DISABLE_REQUEST = 'MFA_DISABLE_REQUEST' as const; const MFA_DISABLE_SUCCESS = 'MFA_DISABLE_SUCCESS' as const; -const MFA_DISABLE_FAIL = 'MFA_DISABLE_FAIL' as const; const fetchMfa = () => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: MFA_FETCH_REQUEST }); - return getClient(getState).settings.mfa.getMfaSettings().then((data) => { + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).settings.mfa.getMfaSettings().then((data) => { dispatch({ type: MFA_FETCH_SUCCESS, data }); - }).catch(() => { - dispatch({ type: MFA_FETCH_FAIL }); }); - }; const fetchBackupCodes = () => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: MFA_BACKUP_CODES_FETCH_REQUEST }); - return getClient(getState).settings.mfa.getMfaBackupCodes().then((data) => { - dispatch({ type: MFA_BACKUP_CODES_FETCH_SUCCESS, data }); - return data; - }).catch((error: unknown) => { - dispatch({ type: MFA_BACKUP_CODES_FETCH_FAIL }); - throw error; - }); - }; + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).settings.mfa.getMfaBackupCodes(); const setupMfa = (method: 'totp') => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: MFA_SETUP_REQUEST, method }); - return getClient(getState).settings.mfa.getMfaSetup(method).then((data) => { - dispatch({ type: MFA_SETUP_SUCCESS, data }); - return data; - }).catch((error: unknown) => { - dispatch({ type: MFA_SETUP_FAIL }); - throw error; - }); - }; + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).settings.mfa.getMfaSetup(method); const confirmMfa = (method: 'totp', code: string, password: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: MFA_CONFIRM_REQUEST, method, code }); - return getClient(getState).settings.mfa.confirmMfaSetup(method, code, password).then((data) => { + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).settings.mfa.confirmMfaSetup(method, code, password).then((data) => { dispatch({ type: MFA_CONFIRM_SUCCESS, method, code }); return data; - }).catch((error: unknown) => { - dispatch({ type: MFA_CONFIRM_FAIL, method, code, error, skipAlert: true }); - throw error; }); - }; const disableMfa = (method: 'totp', password: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: MFA_DISABLE_REQUEST, method }); - return getClient(getState).settings.mfa.disableMfa(method, password).then((data) => { + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).settings.mfa.disableMfa(method, password).then((data) => { dispatch({ type: MFA_DISABLE_SUCCESS, method }); return data; - }).catch((error: unknown) => { - dispatch({ type: MFA_DISABLE_FAIL, method, skipAlert: true }); - throw error; }); - }; type MfaAction = - | { type: typeof MFA_FETCH_REQUEST } | { type: typeof MFA_FETCH_SUCCESS; data: Awaited)['settings']['mfa']['getMfaSettings']>> } - | { type: typeof MFA_FETCH_FAIL } - | { type: typeof MFA_BACKUP_CODES_FETCH_REQUEST } - | { type: typeof MFA_BACKUP_CODES_FETCH_SUCCESS; data: Awaited)['settings']['mfa']['getMfaBackupCodes']>> } - | { type: typeof MFA_BACKUP_CODES_FETCH_FAIL } - | { type: typeof MFA_SETUP_REQUEST; method: 'totp' } - | { type: typeof MFA_SETUP_SUCCESS; data: Awaited)['settings']['mfa']['getMfaSetup']>> } - | { type: typeof MFA_SETUP_FAIL } - | { type: typeof MFA_CONFIRM_REQUEST; method: 'totp'; code: string } | { type: typeof MFA_CONFIRM_SUCCESS; method: 'totp'; code: string } - | { type: typeof MFA_CONFIRM_FAIL; method: 'totp'; code: string; error: unknown; skipAlert: true } - | { type: typeof MFA_DISABLE_REQUEST; method: 'totp' } | { type: typeof MFA_DISABLE_SUCCESS; method: 'totp' } - | { type: typeof MFA_DISABLE_FAIL; method: 'totp'; skipAlert: true }; export { - MFA_FETCH_REQUEST, MFA_FETCH_SUCCESS, - MFA_FETCH_FAIL, - MFA_BACKUP_CODES_FETCH_REQUEST, - MFA_BACKUP_CODES_FETCH_SUCCESS, - MFA_BACKUP_CODES_FETCH_FAIL, - MFA_SETUP_REQUEST, - MFA_SETUP_SUCCESS, - MFA_SETUP_FAIL, - MFA_CONFIRM_REQUEST, MFA_CONFIRM_SUCCESS, - MFA_CONFIRM_FAIL, - MFA_DISABLE_REQUEST, MFA_DISABLE_SUCCESS, - MFA_DISABLE_FAIL, fetchMfa, fetchBackupCodes, setupMfa, diff --git a/packages/pl-fe/src/actions/notifications.ts b/packages/pl-fe/src/actions/notifications.ts index 7d4c8d7fa..5f93b8d98 100644 --- a/packages/pl-fe/src/actions/notifications.ts +++ b/packages/pl-fe/src/actions/notifications.ts @@ -5,6 +5,7 @@ import { defineMessages } from 'react-intl'; import { getClient } from 'pl-fe/api'; import { getNotificationStatus } from 'pl-fe/features/notifications/components/notification'; import { normalizeNotification } from 'pl-fe/normalizers/notification'; +import { appendFollowRequest } from 'pl-fe/queries/accounts/use-follow-requests'; import { getFilters, regexFromFilters } from 'pl-fe/selectors'; import { useSettingsStore } from 'pl-fe/stores/settings'; import { isLoggedIn } from 'pl-fe/utils/auth'; @@ -32,8 +33,6 @@ const NOTIFICATIONS_FILTER_SET = 'NOTIFICATIONS_FILTER_SET' as const; const NOTIFICATIONS_SCROLL_TOP = 'NOTIFICATIONS_SCROLL_TOP' as const; -const MAX_QUEUED_NOTIFICATIONS = 40; - const FILTER_TYPES = { all: undefined, mention: ['mention'], @@ -74,9 +73,14 @@ const updateNotifications = (notification: BaseNotification) => statuses: [getNotificationStatus(notification) as any], })); + if (showInColumn) { const normalizedNotification = normalizeNotification(notification); + if (normalizedNotification.type === 'follow_request') { + normalizedNotification.sample_account_ids.forEach(appendFollowRequest); + } + dispatch({ type: NOTIFICATIONS_UPDATE, notification: normalizedNotification, @@ -282,13 +286,11 @@ type NotificationsAction = export { NOTIFICATIONS_UPDATE, - NOTIFICATIONS_UPDATE_NOOP, NOTIFICATIONS_EXPAND_REQUEST, NOTIFICATIONS_EXPAND_SUCCESS, NOTIFICATIONS_EXPAND_FAIL, NOTIFICATIONS_FILTER_SET, NOTIFICATIONS_SCROLL_TOP, - MAX_QUEUED_NOTIFICATIONS, type FilterType, updateNotifications, updateNotificationsQueue, diff --git a/packages/pl-fe/src/actions/oauth.ts b/packages/pl-fe/src/actions/oauth.ts index 652716b62..70b6caf03 100644 --- a/packages/pl-fe/src/actions/oauth.ts +++ b/packages/pl-fe/src/actions/oauth.ts @@ -13,49 +13,20 @@ import { getBaseURL } from 'pl-fe/utils/state'; import type { AppDispatch, RootState } from 'pl-fe/store'; -const OAUTH_TOKEN_CREATE_REQUEST = 'OAUTH_TOKEN_CREATE_REQUEST' as const; -const OAUTH_TOKEN_CREATE_SUCCESS = 'OAUTH_TOKEN_CREATE_SUCCESS' as const; -const OAUTH_TOKEN_CREATE_FAIL = 'OAUTH_TOKEN_CREATE_FAIL' as const; +const obtainOAuthToken = (params: GetTokenParams, baseURL?: string) =>{ + const client = new PlApiClient(baseURL || BuildConfig.BACKEND_URL || ''); -const OAUTH_TOKEN_REVOKE_REQUEST = 'OAUTH_TOKEN_REVOKE_REQUEST' as const; -const OAUTH_TOKEN_REVOKE_SUCCESS = 'OAUTH_TOKEN_REVOKE_SUCCESS' as const; -const OAUTH_TOKEN_REVOKE_FAIL = 'OAUTH_TOKEN_REVOKE_FAIL' as const; - -const obtainOAuthToken = (params: GetTokenParams, baseURL?: string) => - (dispatch: AppDispatch) => { - dispatch({ type: OAUTH_TOKEN_CREATE_REQUEST, params }); - const client = new PlApiClient(baseURL || BuildConfig.BACKEND_URL || ''); - - return client.oauth.getToken(params).then((token) => { - dispatch({ type: OAUTH_TOKEN_CREATE_SUCCESS, params, token }); - return token; - }).catch(error => { - dispatch({ type: OAUTH_TOKEN_CREATE_FAIL, params, error, skipAlert: true }); - throw error; - }); - }; + return client.oauth.getToken(params); +}; const revokeOAuthToken = (params: RevokeTokenParams) => (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: OAUTH_TOKEN_REVOKE_REQUEST, params }); const baseURL = getBaseURL(getState()); const client = new PlApiClient(baseURL || ''); - return client.oauth.revokeToken(params).then((data) => { - dispatch({ type: OAUTH_TOKEN_REVOKE_SUCCESS, params, data }); - return data; - }).catch(error => { - dispatch({ type: OAUTH_TOKEN_REVOKE_FAIL, params, error }); - throw error; - }); + return client.oauth.revokeToken(params); }; export { - OAUTH_TOKEN_CREATE_REQUEST, - OAUTH_TOKEN_CREATE_SUCCESS, - OAUTH_TOKEN_CREATE_FAIL, - OAUTH_TOKEN_REVOKE_REQUEST, - OAUTH_TOKEN_REVOKE_SUCCESS, - OAUTH_TOKEN_REVOKE_FAIL, obtainOAuthToken, revokeOAuthToken, }; diff --git a/packages/pl-fe/src/actions/pin-statuses.ts b/packages/pl-fe/src/actions/pin-statuses.ts index e9ddd0b92..4103689e0 100644 --- a/packages/pl-fe/src/actions/pin-statuses.ts +++ b/packages/pl-fe/src/actions/pin-statuses.ts @@ -7,49 +7,29 @@ import { importEntities } from './importer'; import type { PaginatedResponse, Status } from 'pl-api'; import type { AppDispatch, RootState } from 'pl-fe/store'; -const PINNED_STATUSES_FETCH_REQUEST = 'PINNED_STATUSES_FETCH_REQUEST' as const; const PINNED_STATUSES_FETCH_SUCCESS = 'PINNED_STATUSES_FETCH_SUCCESS' as const; -const PINNED_STATUSES_FETCH_FAIL = 'PINNED_STATUSES_FETCH_FAIL' as const; const fetchPinnedStatuses = () => (dispatch: AppDispatch, getState: () => RootState) => { if (!isLoggedIn(getState)) return; const me = getState().me; - dispatch(fetchPinnedStatusesRequest()); - return getClient(getState()).accounts.getAccountStatuses(me as string, { pinned: true }).then(response => { dispatch(importEntities({ statuses: response.items })); dispatch(fetchPinnedStatusesSuccess(response.items, response.next)); - }).catch(error => { - dispatch(fetchPinnedStatusesFail(error)); }); }; -const fetchPinnedStatusesRequest = () => ({ - type: PINNED_STATUSES_FETCH_REQUEST, -}); - const fetchPinnedStatusesSuccess = (statuses: Array, next: (() => Promise>) | null) => ({ type: PINNED_STATUSES_FETCH_SUCCESS, statuses, next, }); -const fetchPinnedStatusesFail = (error: unknown) => ({ - type: PINNED_STATUSES_FETCH_FAIL, - error, -}); - -type PinStatusesAction = - ReturnType - | ReturnType - | ReturnType; +type PinStatusesAction = ReturnType; export { - PINNED_STATUSES_FETCH_REQUEST, PINNED_STATUSES_FETCH_SUCCESS, - PINNED_STATUSES_FETCH_FAIL, fetchPinnedStatuses, type PinStatusesAction, }; diff --git a/packages/pl-fe/src/actions/pl-fe.ts b/packages/pl-fe/src/actions/pl-fe.ts index 6a81db1d9..1072cd805 100644 --- a/packages/pl-fe/src/actions/pl-fe.ts +++ b/packages/pl-fe/src/actions/pl-fe.ts @@ -22,12 +22,11 @@ const getPlFeConfig = createSelector([ ], (plfe) => v.parse(plFeConfigSchema, plfe)); const rememberPlFeConfig = (host: string | null) => - (dispatch: AppDispatch) => { - return KVStore.getItemOrError(`plfe_config:${host}`).then(plFeConfig => { + (dispatch: AppDispatch) => + KVStore.getItemOrError(`plfe_config:${host}`).then(plFeConfig => { dispatch({ type: PLFE_CONFIG_REMEMBER_SUCCESS, host, plFeConfig }); return plFeConfig; }).catch(() => {}); - }; const fetchFrontendConfigurations = () => (dispatch: AppDispatch, getState: () => RootState) => @@ -101,11 +100,6 @@ export { PLFE_CONFIG_REQUEST_FAIL, PLFE_CONFIG_REMEMBER_SUCCESS, getPlFeConfig, - rememberPlFeConfig, - fetchFrontendConfigurations, fetchPlFeConfig, loadPlFeConfig, - fetchPlFeJson, - importPlFeConfig, - plFeConfigFail, }; diff --git a/packages/pl-fe/src/actions/polls.ts b/packages/pl-fe/src/actions/polls.ts index 0f3780c03..43458d058 100644 --- a/packages/pl-fe/src/actions/polls.ts +++ b/packages/pl-fe/src/actions/polls.ts @@ -2,81 +2,21 @@ import { getClient } from '../api'; import { importEntities } from './importer'; -import type { Poll } from 'pl-api'; import type { AppDispatch, RootState } from 'pl-fe/store'; -const POLL_VOTE_REQUEST = 'POLL_VOTE_REQUEST' as const; -const POLL_VOTE_SUCCESS = 'POLL_VOTE_SUCCESS' as const; -const POLL_VOTE_FAIL = 'POLL_VOTE_FAIL' as const; - -const POLL_FETCH_REQUEST = 'POLL_FETCH_REQUEST' as const; -const POLL_FETCH_SUCCESS = 'POLL_FETCH_SUCCESS' as const; -const POLL_FETCH_FAIL = 'POLL_FETCH_FAIL' as const; - const vote = (pollId: string, choices: number[]) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch(voteRequest()); - - return getClient(getState()).polls.vote(pollId, choices).then((data) => { + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState()).polls.vote(pollId, choices).then((data) => { dispatch(importEntities({ polls: [data] })); - dispatch(voteSuccess(data)); - }).catch(err => dispatch(voteFail(err))); - }; + }); const fetchPoll = (pollId: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch(fetchPollRequest()); - - return getClient(getState()).polls.getPoll(pollId).then((data) => { + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState()).polls.getPoll(pollId).then((data) => { dispatch(importEntities({ polls: [data] })); - dispatch(fetchPollSuccess(data)); - }).catch(err => dispatch(fetchPollFail(err))); - }; - -const voteRequest = () => ({ - type: POLL_VOTE_REQUEST, -}); - -const voteSuccess = (poll: Poll) => ({ - type: POLL_VOTE_SUCCESS, - poll, -}); - -const voteFail = (error: unknown) => ({ - type: POLL_VOTE_FAIL, - error, -}); - -const fetchPollRequest = () => ({ - type: POLL_FETCH_REQUEST, -}); - -const fetchPollSuccess = (poll: Poll) => ({ - type: POLL_FETCH_SUCCESS, - poll, -}); - -const fetchPollFail = (error: unknown) => ({ - type: POLL_FETCH_FAIL, - error, -}); - -type PollsAction = - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType; + }); export { - POLL_VOTE_REQUEST, - POLL_VOTE_SUCCESS, - POLL_VOTE_FAIL, - POLL_FETCH_REQUEST, - POLL_FETCH_SUCCESS, - POLL_FETCH_FAIL, vote, fetchPoll, - type PollsAction, }; diff --git a/packages/pl-fe/src/actions/push-notifications/registerer.ts b/packages/pl-fe/src/actions/push-notifications/registerer.ts index ac19530a3..3d9983dec 100644 --- a/packages/pl-fe/src/actions/push-notifications/registerer.ts +++ b/packages/pl-fe/src/actions/push-notifications/registerer.ts @@ -1,4 +1,4 @@ -import { createPushSubscription, updatePushSubscription } from 'pl-fe/actions/push-subscriptions'; +import { createPushSubscription } from 'pl-fe/actions/push-subscriptions'; import { pushNotificationsSetting } from 'pl-fe/settings'; import { getVapidKey } from 'pl-fe/utils/auth'; import { decode as decodeBase64 } from 'pl-fe/utils/base64'; @@ -135,21 +135,6 @@ const register = () => .catch(console.warn); }; -const saveSettings = () => - (dispatch: AppDispatch, getState: () => RootState) => { - const state = getState().push_notifications; - const alerts = state.alerts; - const data = { alerts }; - const me = getState().me; - - return dispatch(updatePushSubscription({ data })).then(() => { - if (me) { - pushNotificationsSetting.set(me, data); - } - }).catch(console.warn); - }; - export { register, - saveSettings, }; diff --git a/packages/pl-fe/src/actions/push-subscriptions.ts b/packages/pl-fe/src/actions/push-subscriptions.ts index 332f9bc42..90f0068df 100644 --- a/packages/pl-fe/src/actions/push-subscriptions.ts +++ b/packages/pl-fe/src/actions/push-subscriptions.ts @@ -1,17 +1,12 @@ import { getClient } from '../api'; -import type { CreatePushNotificationsSubscriptionParams, UpdatePushNotificationsSubscriptionParams } from 'pl-api'; +import type { CreatePushNotificationsSubscriptionParams } from 'pl-api'; import type { AppDispatch, RootState } from 'pl-fe/store'; const createPushSubscription = (params: CreatePushNotificationsSubscriptionParams) => (dispatch: AppDispatch, getState: () => RootState) => getClient(getState).pushNotifications.createSubscription(params); -const updatePushSubscription = (params: UpdatePushNotificationsSubscriptionParams) => - (dispatch: AppDispatch, getState: () => RootState) => - getClient(getState).pushNotifications.updateSubscription(params); - export { createPushSubscription, - updatePushSubscription, }; diff --git a/packages/pl-fe/src/actions/scheduled-statuses.ts b/packages/pl-fe/src/actions/scheduled-statuses.ts index c0d27fe3a..e2473419c 100644 --- a/packages/pl-fe/src/actions/scheduled-statuses.ts +++ b/packages/pl-fe/src/actions/scheduled-statuses.ts @@ -13,7 +13,6 @@ const SCHEDULED_STATUSES_EXPAND_FAIL = 'SCHEDULED_STATUSES_EXPAND_FAIL' as const const SCHEDULED_STATUS_CANCEL_REQUEST = 'SCHEDULED_STATUS_CANCEL_REQUEST' as const; const SCHEDULED_STATUS_CANCEL_SUCCESS = 'SCHEDULED_STATUS_CANCEL_SUCCESS' as const; -const SCHEDULED_STATUS_CANCEL_FAIL = 'SCHEDULED_STATUS_CANCEL_FAIL' as const; const fetchScheduledStatuses = () => (dispatch: AppDispatch, getState: () => RootState) => { @@ -46,19 +45,11 @@ interface ScheduledStatusCancelSuccessAction { statusId: string; } -interface ScheduledStatusCancelFailAction { - type: typeof SCHEDULED_STATUS_CANCEL_FAIL; - statusId: string; - error: unknown; -} - const cancelScheduledStatus = (statusId: string) => (dispatch: AppDispatch, getState: () => RootState) => { dispatch({ type: SCHEDULED_STATUS_CANCEL_REQUEST, statusId }); return getClient(getState()).scheduledStatuses.cancelScheduledStatus(statusId).then(() => { dispatch({ type: SCHEDULED_STATUS_CANCEL_SUCCESS, statusId }); - }).catch(error => { - dispatch({ type: SCHEDULED_STATUS_CANCEL_FAIL, statusId, error }); }); }; @@ -112,7 +103,6 @@ const expandScheduledStatusesFail = (error: unknown) => ({ type ScheduledStatusesAction = | ScheduledStatusCancelRequestAction | ScheduledStatusCancelSuccessAction - | ScheduledStatusCancelFailAction | ReturnType | ReturnType | ReturnType @@ -129,7 +119,6 @@ export { SCHEDULED_STATUSES_EXPAND_FAIL, SCHEDULED_STATUS_CANCEL_REQUEST, SCHEDULED_STATUS_CANCEL_SUCCESS, - SCHEDULED_STATUS_CANCEL_FAIL, fetchScheduledStatuses, cancelScheduledStatus, expandScheduledStatuses, diff --git a/packages/pl-fe/src/actions/security.ts b/packages/pl-fe/src/actions/security.ts index f8a6702a5..16f17e493 100644 --- a/packages/pl-fe/src/actions/security.ts +++ b/packages/pl-fe/src/actions/security.ts @@ -15,176 +15,62 @@ import type { OauthToken } from 'pl-api'; import type { Account } from 'pl-fe/normalizers/account'; import type { AppDispatch, RootState } from 'pl-fe/store'; -const FETCH_TOKENS_REQUEST = 'FETCH_TOKENS_REQUEST' as const; const FETCH_TOKENS_SUCCESS = 'FETCH_TOKENS_SUCCESS' as const; -const FETCH_TOKENS_FAIL = 'FETCH_TOKENS_FAIL' as const; -const REVOKE_TOKEN_REQUEST = 'REVOKE_TOKEN_REQUEST' as const; const REVOKE_TOKEN_SUCCESS = 'REVOKE_TOKEN_SUCCESS' as const; -const REVOKE_TOKEN_FAIL = 'REVOKE_TOKEN_FAIL' as const; - -const RESET_PASSWORD_REQUEST = 'RESET_PASSWORD_REQUEST' as const; -const RESET_PASSWORD_SUCCESS = 'RESET_PASSWORD_SUCCESS' as const; -const RESET_PASSWORD_FAIL = 'RESET_PASSWORD_FAIL' as const; - -const RESET_PASSWORD_CONFIRM_REQUEST = 'RESET_PASSWORD_CONFIRM_REQUEST' as const; -const RESET_PASSWORD_CONFIRM_SUCCESS = 'RESET_PASSWORD_CONFIRM_SUCCESS' as const; -const RESET_PASSWORD_CONFIRM_FAIL = 'RESET_PASSWORD_CONFIRM_FAIL' as const; - -const CHANGE_PASSWORD_REQUEST = 'CHANGE_PASSWORD_REQUEST' as const; -const CHANGE_PASSWORD_SUCCESS = 'CHANGE_PASSWORD_SUCCESS' as const; -const CHANGE_PASSWORD_FAIL = 'CHANGE_PASSWORD_FAIL' as const; - -const CHANGE_EMAIL_REQUEST = 'CHANGE_EMAIL_REQUEST' as const; -const CHANGE_EMAIL_SUCCESS = 'CHANGE_EMAIL_SUCCESS' as const; -const CHANGE_EMAIL_FAIL = 'CHANGE_EMAIL_FAIL' as const; - -const DELETE_ACCOUNT_REQUEST = 'DELETE_ACCOUNT_REQUEST' as const; -const DELETE_ACCOUNT_SUCCESS = 'DELETE_ACCOUNT_SUCCESS' as const; -const DELETE_ACCOUNT_FAIL = 'DELETE_ACCOUNT_FAIL' as const; - -const MOVE_ACCOUNT_REQUEST = 'MOVE_ACCOUNT_REQUEST' as const; -const MOVE_ACCOUNT_SUCCESS = 'MOVE_ACCOUNT_SUCCESS' as const; -const MOVE_ACCOUNT_FAIL = 'MOVE_ACCOUNT_FAIL' as const; const fetchOAuthTokens = () => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: FETCH_TOKENS_REQUEST }); - return getClient(getState).settings.getOauthTokens().then((tokens) => { + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).settings.getOauthTokens().then((tokens) => { dispatch({ type: FETCH_TOKENS_SUCCESS, tokens }); - }).catch((e) => { - dispatch({ type: FETCH_TOKENS_FAIL }); }); - }; const revokeOAuthTokenById = (tokenId: number) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: REVOKE_TOKEN_REQUEST, tokenId }); - return getClient(getState).settings.deleteOauthToken(tokenId).then(() => { + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).settings.deleteOauthToken(tokenId).then(() => { dispatch({ type: REVOKE_TOKEN_SUCCESS, tokenId }); - }).catch(() => { - dispatch({ type: REVOKE_TOKEN_FAIL, tokenId }); }); - }; const changePassword = (oldPassword: string, newPassword: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: CHANGE_PASSWORD_REQUEST }); - - return getClient(getState).settings.changePassword(oldPassword, newPassword).then(response => { - dispatch({ type: CHANGE_PASSWORD_SUCCESS, response }); - }).catch(error => { - dispatch({ type: CHANGE_PASSWORD_FAIL, error, skipAlert: true }); - throw error; - }); - }; + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).settings.changePassword(oldPassword, newPassword); const resetPassword = (usernameOrEmail: string) => (dispatch: AppDispatch, getState: () => RootState) => { const input = normalizeUsername(usernameOrEmail); - dispatch({ type: RESET_PASSWORD_REQUEST }); - return getClient(getState).settings.resetPassword( input.includes('@') ? input : undefined, input.includes('@') ? undefined : input, - ).then(() => { - dispatch({ type: RESET_PASSWORD_SUCCESS }); - }).catch(error => { - dispatch({ type: RESET_PASSWORD_FAIL, error }); - throw error; - }); + ); }; const changeEmail = (email: string, password: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: CHANGE_EMAIL_REQUEST, email }); - - return getClient(getState).settings.changeEmail(email, password).then(response => { - dispatch({ type: CHANGE_EMAIL_SUCCESS, email, response }); - }).catch(error => { - dispatch({ type: CHANGE_EMAIL_FAIL, email, error, skipAlert: true }); - throw error; - }); - }; + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).settings.changeEmail(email, password); const deleteAccount = (password: string) => (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: CHANGE_PASSWORD_REQUEST }); const account = getLoggedInAccount(getState())!; - dispatch({ type: DELETE_ACCOUNT_REQUEST }); - return getClient(getState).settings.deleteAccount(password).then(response => { - dispatch({ type: DELETE_ACCOUNT_SUCCESS, response }); + return getClient(getState).settings.deleteAccount(password).then(() => { dispatch({ type: AUTH_LOGGED_OUT, account }); toast.success(messages.loggedOut); - }).catch(error => { - dispatch({ type: DELETE_ACCOUNT_FAIL, error, skipAlert: true }); - throw error; }); }; const moveAccount = (targetAccount: string, password: string) => - (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: MOVE_ACCOUNT_REQUEST }); - return getClient(getState).settings.moveAccount(targetAccount, password).then(response => { - dispatch({ type: MOVE_ACCOUNT_SUCCESS, response }); - }).catch(error => { - dispatch({ type: MOVE_ACCOUNT_FAIL, error, skipAlert: true }); - throw error; - }); - }; + (dispatch: AppDispatch, getState: () => RootState) => + getClient(getState).settings.moveAccount(targetAccount, password); type SecurityAction = - | { type: typeof FETCH_TOKENS_REQUEST } | { type: typeof FETCH_TOKENS_SUCCESS; tokens: Array } - | { type: typeof FETCH_TOKENS_FAIL } - | { type: typeof REVOKE_TOKEN_REQUEST; tokenId: number } | { type: typeof REVOKE_TOKEN_SUCCESS; tokenId: number } - | { type: typeof REVOKE_TOKEN_FAIL; tokenId: number } - | { type: typeof CHANGE_PASSWORD_REQUEST } - | { type: typeof CHANGE_PASSWORD_SUCCESS; response: {} } - | { type: typeof CHANGE_PASSWORD_FAIL; error: unknown; skipAlert: true } - | { type: typeof RESET_PASSWORD_REQUEST } - | { type: typeof RESET_PASSWORD_SUCCESS } - | { type: typeof RESET_PASSWORD_FAIL; error: unknown } - | { type: typeof CHANGE_EMAIL_REQUEST; email: string } - | { type: typeof CHANGE_EMAIL_SUCCESS; email: string; response: {} } - | { type: typeof CHANGE_EMAIL_FAIL; email: string; error: unknown; skipAlert: true } - | { type: typeof CHANGE_PASSWORD_REQUEST } - | { type: typeof DELETE_ACCOUNT_REQUEST } - | { type: typeof DELETE_ACCOUNT_SUCCESS; response: {} } | { type: typeof AUTH_LOGGED_OUT; account: Account } - | { type: typeof DELETE_ACCOUNT_FAIL; error: unknown; skipAlert: true } - | { type: typeof MOVE_ACCOUNT_REQUEST } - | { type: typeof MOVE_ACCOUNT_SUCCESS; response: {} } - | { type: typeof MOVE_ACCOUNT_FAIL; error: unknown; skipAlert: true } export { - FETCH_TOKENS_REQUEST, FETCH_TOKENS_SUCCESS, - FETCH_TOKENS_FAIL, - REVOKE_TOKEN_REQUEST, REVOKE_TOKEN_SUCCESS, - REVOKE_TOKEN_FAIL, - RESET_PASSWORD_REQUEST, - RESET_PASSWORD_SUCCESS, - RESET_PASSWORD_FAIL, - RESET_PASSWORD_CONFIRM_REQUEST, - RESET_PASSWORD_CONFIRM_SUCCESS, - RESET_PASSWORD_CONFIRM_FAIL, - CHANGE_PASSWORD_REQUEST, - CHANGE_PASSWORD_SUCCESS, - CHANGE_PASSWORD_FAIL, - CHANGE_EMAIL_REQUEST, - CHANGE_EMAIL_SUCCESS, - CHANGE_EMAIL_FAIL, - DELETE_ACCOUNT_REQUEST, - DELETE_ACCOUNT_SUCCESS, - DELETE_ACCOUNT_FAIL, - MOVE_ACCOUNT_REQUEST, - MOVE_ACCOUNT_SUCCESS, - MOVE_ACCOUNT_FAIL, fetchOAuthTokens, revokeOAuthTokenById, changePassword, diff --git a/packages/pl-fe/src/actions/settings.ts b/packages/pl-fe/src/actions/settings.ts index 04e6c526b..65ded3f3f 100644 --- a/packages/pl-fe/src/actions/settings.ts +++ b/packages/pl-fe/src/actions/settings.ts @@ -17,13 +17,16 @@ const FE_NAME = 'pl_fe'; type SettingOpts = { /** Whether to display an alert when settings are saved. */ showAlert?: boolean; + save?: boolean; } const saveSuccessMessage = defineMessage({ id: 'settings.save.success', defaultMessage: 'Your preferences have been saved!' }); const changeSetting = (path: string[], value: any, opts?: SettingOpts) => { useSettingsStore.getState().changeSetting(path, value); - return saveSettings(opts); + + if (opts?.save !== false) return saveSettings(opts); + return () => {}; }; const saveSettings = (opts?: SettingOpts) => diff --git a/packages/pl-fe/src/actions/statuses.ts b/packages/pl-fe/src/actions/statuses.ts index a5b45533c..882df2302 100644 --- a/packages/pl-fe/src/actions/statuses.ts +++ b/packages/pl-fe/src/actions/statuses.ts @@ -22,25 +22,15 @@ const STATUS_FETCH_SOURCE_REQUEST = 'STATUS_FETCH_SOURCE_REQUEST' as const; const STATUS_FETCH_SOURCE_SUCCESS = 'STATUS_FETCH_SOURCE_SUCCESS' as const; const STATUS_FETCH_SOURCE_FAIL = 'STATUS_FETCH_SOURCE_FAIL' as const; -const STATUS_FETCH_REQUEST = 'STATUS_FETCH_REQUEST' as const; -const STATUS_FETCH_SUCCESS = 'STATUS_FETCH_SUCCESS' as const; -const STATUS_FETCH_FAIL = 'STATUS_FETCH_FAIL' as const; - const STATUS_DELETE_REQUEST = 'STATUS_DELETE_REQUEST' as const; const STATUS_DELETE_SUCCESS = 'STATUS_DELETE_SUCCESS' as const; const STATUS_DELETE_FAIL = 'STATUS_DELETE_FAIL' as const; -const CONTEXT_FETCH_REQUEST = 'CONTEXT_FETCH_REQUEST' as const; const CONTEXT_FETCH_SUCCESS = 'CONTEXT_FETCH_SUCCESS' as const; -const CONTEXT_FETCH_FAIL = 'CONTEXT_FETCH_FAIL' as const; -const STATUS_MUTE_REQUEST = 'STATUS_MUTE_REQUEST' as const; const STATUS_MUTE_SUCCESS = 'STATUS_MUTE_SUCCESS' as const; -const STATUS_MUTE_FAIL = 'STATUS_MUTE_FAIL' as const; -const STATUS_UNMUTE_REQUEST = 'STATUS_UNMUTE_REQUEST' as const; const STATUS_UNMUTE_SUCCESS = 'STATUS_UNMUTE_SUCCESS' as const; -const STATUS_UNMUTE_FAIL = 'STATUS_UNMUTE_FAIL' as const; const STATUS_UNFILTER = 'STATUS_UNFILTER' as const; @@ -99,18 +89,13 @@ const editStatus = (statusId: string) => (dispatch: AppDispatch, getState: () => const fetchStatus = (statusId: string, intl?: IntlShape) => (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: STATUS_FETCH_REQUEST, statusId }); - const params = intl && useSettingsStore.getState().settings.autoTranslate ? { language: intl.locale, } : undefined; return getClient(getState()).statuses.getStatus(statusId, params).then(status => { dispatch(importEntities({ statuses: [status] })); - dispatch({ type: STATUS_FETCH_SUCCESS, status }); return status; - }).catch(error => { - dispatch({ type: STATUS_FETCH_FAIL, statusId, error, skipAlert: true }); }); }; @@ -144,8 +129,6 @@ const updateStatus = (status: BaseStatus) => (dispatch: AppDispatch) => const fetchContext = (statusId: string, intl?: IntlShape) => (dispatch: AppDispatch, getState: () => RootState) => { - dispatch({ type: CONTEXT_FETCH_REQUEST, statusId }); - const params = intl && useSettingsStore.getState().settings.autoTranslate ? { language: intl.locale, } : undefined; @@ -160,8 +143,6 @@ const fetchContext = (statusId: string, intl?: IntlShape) => if (error.response?.status === 404) { dispatch(deleteFromTimelines(statusId)); } - - dispatch({ type: CONTEXT_FETCH_FAIL, statusId, error, skipAlert: true }); }); }; @@ -175,11 +156,8 @@ const muteStatus = (statusId: string) => (dispatch: AppDispatch, getState: () => RootState) => { if (!isLoggedIn(getState)) return; - dispatch({ type: STATUS_MUTE_REQUEST, statusId }); return getClient(getState()).statuses.muteStatus(statusId).then((status) => { dispatch({ type: STATUS_MUTE_SUCCESS, statusId }); - }).catch(error => { - dispatch({ type: STATUS_MUTE_FAIL, statusId, error }); }); }; @@ -187,22 +165,13 @@ const unmuteStatus = (statusId: string) => (dispatch: AppDispatch, getState: () => RootState) => { if (!isLoggedIn(getState)) return; - dispatch({ type: STATUS_UNMUTE_REQUEST, statusId }); return getClient(getState()).statuses.unmuteStatus(statusId).then(() => { dispatch({ type: STATUS_UNMUTE_SUCCESS, statusId }); - }).catch(error => { - dispatch({ type: STATUS_UNMUTE_FAIL, statusId, error }); }); }; const toggleMuteStatus = (status: Pick) => - (dispatch: AppDispatch) => { - if (status.muted) { - dispatch(unmuteStatus(status.id)); - } else { - dispatch(muteStatus(status.id)); - } - }; + status.muted ? unmuteStatus(status.id) : muteStatus(status.id); // let TRANSLATIONS_QUEUE: Set = new Set(); // let TRANSLATIONS_TIMEOUT: NodeJS.Timeout | null = null; @@ -265,21 +234,12 @@ type StatusesAction = | { type: typeof STATUS_FETCH_SOURCE_REQUEST } | { type: typeof STATUS_FETCH_SOURCE_SUCCESS } | { type: typeof STATUS_FETCH_SOURCE_FAIL; error: unknown } - | { type: typeof STATUS_FETCH_REQUEST; statusId: string } - | { type: typeof STATUS_FETCH_SUCCESS; status: BaseStatus } - | { type: typeof STATUS_FETCH_FAIL; statusId: string; error: unknown; skipAlert: true } | { type: typeof STATUS_DELETE_REQUEST; params: Pick } | { type: typeof STATUS_DELETE_SUCCESS; statusId: string } | { type: typeof STATUS_DELETE_FAIL; params: Pick; error: unknown } - | { type: typeof CONTEXT_FETCH_REQUEST; statusId: string } | { type: typeof CONTEXT_FETCH_SUCCESS; statusId: string; ancestors: Array; descendants: Array } - | { type: typeof CONTEXT_FETCH_FAIL; statusId: string; error: unknown; skipAlert: true } - | { type: typeof STATUS_MUTE_REQUEST; statusId: string } | { type: typeof STATUS_MUTE_SUCCESS; statusId: string } - | { type: typeof STATUS_MUTE_FAIL; statusId: string; error: unknown } - | { type: typeof STATUS_UNMUTE_REQUEST; statusId: string } | { type: typeof STATUS_UNMUTE_SUCCESS; statusId: string } - | { type: typeof STATUS_UNMUTE_FAIL; statusId: string; error: unknown } | ReturnType export { @@ -289,21 +249,12 @@ export { STATUS_FETCH_SOURCE_REQUEST, STATUS_FETCH_SOURCE_SUCCESS, STATUS_FETCH_SOURCE_FAIL, - STATUS_FETCH_REQUEST, - STATUS_FETCH_SUCCESS, - STATUS_FETCH_FAIL, STATUS_DELETE_REQUEST, STATUS_DELETE_SUCCESS, STATUS_DELETE_FAIL, - CONTEXT_FETCH_REQUEST, CONTEXT_FETCH_SUCCESS, - CONTEXT_FETCH_FAIL, - STATUS_MUTE_REQUEST, STATUS_MUTE_SUCCESS, - STATUS_MUTE_FAIL, - STATUS_UNMUTE_REQUEST, STATUS_UNMUTE_SUCCESS, - STATUS_UNMUTE_FAIL, STATUS_UNFILTER, createStatus, editStatus, diff --git a/packages/pl-fe/src/actions/tags.ts b/packages/pl-fe/src/actions/tags.ts deleted file mode 100644 index f642f5d05..000000000 --- a/packages/pl-fe/src/actions/tags.ts +++ /dev/null @@ -1,198 +0,0 @@ -import { getClient } from '../api'; - -import type { PaginatedResponse, Tag } from 'pl-api'; -import type { AppDispatch, RootState } from 'pl-fe/store'; - -const HASHTAG_FETCH_REQUEST = 'HASHTAG_FETCH_REQUEST' as const; -const HASHTAG_FETCH_SUCCESS = 'HASHTAG_FETCH_SUCCESS' as const; -const HASHTAG_FETCH_FAIL = 'HASHTAG_FETCH_FAIL' as const; - -const HASHTAG_FOLLOW_REQUEST = 'HASHTAG_FOLLOW_REQUEST' as const; -const HASHTAG_FOLLOW_SUCCESS = 'HASHTAG_FOLLOW_SUCCESS' as const; -const HASHTAG_FOLLOW_FAIL = 'HASHTAG_FOLLOW_FAIL' as const; - -const HASHTAG_UNFOLLOW_REQUEST = 'HASHTAG_UNFOLLOW_REQUEST' as const; -const HASHTAG_UNFOLLOW_SUCCESS = 'HASHTAG_UNFOLLOW_SUCCESS' as const; -const HASHTAG_UNFOLLOW_FAIL = 'HASHTAG_UNFOLLOW_FAIL' as const; - -const FOLLOWED_HASHTAGS_FETCH_REQUEST = 'FOLLOWED_HASHTAGS_FETCH_REQUEST' as const; -const FOLLOWED_HASHTAGS_FETCH_SUCCESS = 'FOLLOWED_HASHTAGS_FETCH_SUCCESS' as const; -const FOLLOWED_HASHTAGS_FETCH_FAIL = 'FOLLOWED_HASHTAGS_FETCH_FAIL' as const; - -const FOLLOWED_HASHTAGS_EXPAND_REQUEST = 'FOLLOWED_HASHTAGS_EXPAND_REQUEST' as const; -const FOLLOWED_HASHTAGS_EXPAND_SUCCESS = 'FOLLOWED_HASHTAGS_EXPAND_SUCCESS' as const; -const FOLLOWED_HASHTAGS_EXPAND_FAIL = 'FOLLOWED_HASHTAGS_EXPAND_FAIL' as const; - -const fetchHashtag = (name: string) => (dispatch: AppDispatch, getState: () => RootState) => { - dispatch(fetchHashtagRequest()); - - return getClient(getState()).myAccount.getTag(name).then((data) => { - dispatch(fetchHashtagSuccess(name, data)); - }).catch(err => { - dispatch(fetchHashtagFail(err)); - }); -}; - -const fetchHashtagRequest = () => ({ - type: HASHTAG_FETCH_REQUEST, -}); - -const fetchHashtagSuccess = (name: string, tag: Tag) => ({ - type: HASHTAG_FETCH_SUCCESS, - name, - tag, -}); - -const fetchHashtagFail = (error: unknown) => ({ - type: HASHTAG_FETCH_FAIL, - error, -}); - -const followHashtag = (name: string) => (dispatch: AppDispatch, getState: () => RootState) => { - dispatch(followHashtagRequest(name)); - - return getClient(getState()).myAccount.followTag(name).then((data) => { - dispatch(followHashtagSuccess(name, data)); - }).catch(err => { - dispatch(followHashtagFail(name, err)); - }); -}; - -const followHashtagRequest = (name: string) => ({ - type: HASHTAG_FOLLOW_REQUEST, - name, -}); - -const followHashtagSuccess = (name: string, tag: Tag) => ({ - type: HASHTAG_FOLLOW_SUCCESS, - name, - tag, -}); - -const followHashtagFail = (name: string, error: unknown) => ({ - type: HASHTAG_FOLLOW_FAIL, - name, - error, -}); - -const unfollowHashtag = (name: string) => (dispatch: AppDispatch, getState: () => RootState) => { - dispatch(unfollowHashtagRequest(name)); - - return getClient(getState()).myAccount.unfollowTag(name).then((data) => { - dispatch(unfollowHashtagSuccess(name, data)); - }).catch(err => { - dispatch(unfollowHashtagFail(name, err)); - }); -}; - -const unfollowHashtagRequest = (name: string) => ({ - type: HASHTAG_UNFOLLOW_REQUEST, - name, -}); - -const unfollowHashtagSuccess = (name: string, tag: Tag) => ({ - type: HASHTAG_UNFOLLOW_SUCCESS, - name, - tag, -}); - -const unfollowHashtagFail = (name: string, error: unknown) => ({ - type: HASHTAG_UNFOLLOW_FAIL, - name, - error, -}); - -const fetchFollowedHashtags = () => (dispatch: AppDispatch, getState: () => RootState) => { - dispatch(fetchFollowedHashtagsRequest()); - - return getClient(getState()).myAccount.getFollowedTags().then(response => { - dispatch(fetchFollowedHashtagsSuccess(response.items, response.next)); - }).catch(err => { - dispatch(fetchFollowedHashtagsFail(err)); - }); -}; - -const fetchFollowedHashtagsRequest = () => ({ - type: FOLLOWED_HASHTAGS_FETCH_REQUEST, -}); - -const fetchFollowedHashtagsSuccess = (followed_tags: Array, next: (() => Promise>) | null) => ({ - type: FOLLOWED_HASHTAGS_FETCH_SUCCESS, - followed_tags, - next, -}); - -const fetchFollowedHashtagsFail = (error: unknown) => ({ - type: FOLLOWED_HASHTAGS_FETCH_FAIL, - error, -}); - -const expandFollowedHashtags = () => (dispatch: AppDispatch, getState: () => RootState) => { - const next = getState().followed_tags.next; - - if (next === null) return; - - dispatch(expandFollowedHashtagsRequest()); - - return next().then(response => { - dispatch(expandFollowedHashtagsSuccess(response.items, response.next)); - }).catch(error => { - dispatch(expandFollowedHashtagsFail(error)); - }); -}; - -const expandFollowedHashtagsRequest = () => ({ - type: FOLLOWED_HASHTAGS_EXPAND_REQUEST, -}); - -const expandFollowedHashtagsSuccess = (followed_tags: Array, next: (() => Promise>) | null) => ({ - type: FOLLOWED_HASHTAGS_EXPAND_SUCCESS, - followed_tags, - next, -}); - -const expandFollowedHashtagsFail = (error: unknown) => ({ - type: FOLLOWED_HASHTAGS_EXPAND_FAIL, - error, -}); - -type TagsAction = - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType - | ReturnType; - -export { - HASHTAG_FETCH_REQUEST, - HASHTAG_FETCH_SUCCESS, - HASHTAG_FETCH_FAIL, - HASHTAG_FOLLOW_REQUEST, - HASHTAG_FOLLOW_SUCCESS, - HASHTAG_FOLLOW_FAIL, - HASHTAG_UNFOLLOW_REQUEST, - HASHTAG_UNFOLLOW_SUCCESS, - HASHTAG_UNFOLLOW_FAIL, - FOLLOWED_HASHTAGS_FETCH_REQUEST, - FOLLOWED_HASHTAGS_FETCH_SUCCESS, - FOLLOWED_HASHTAGS_FETCH_FAIL, - FOLLOWED_HASHTAGS_EXPAND_REQUEST, - FOLLOWED_HASHTAGS_EXPAND_SUCCESS, - FOLLOWED_HASHTAGS_EXPAND_FAIL, - fetchHashtag, - followHashtag, - unfollowHashtag, - fetchFollowedHashtags, - expandFollowedHashtags, - type TagsAction, -}; diff --git a/packages/pl-fe/src/api/hooks/accounts/use-account-lookup.ts b/packages/pl-fe/src/api/hooks/accounts/use-account-lookup.ts index ac3806700..86abdc638 100644 --- a/packages/pl-fe/src/api/hooks/accounts/use-account-lookup.ts +++ b/packages/pl-fe/src/api/hooks/accounts/use-account-lookup.ts @@ -8,7 +8,8 @@ import { useFeatures } from 'pl-fe/hooks/use-features'; import { useLoggedIn } from 'pl-fe/hooks/use-logged-in'; import { type Account, normalizeAccount } from 'pl-fe/normalizers/account'; -import { useAccountScrobble } from './use-account-scrobble'; +import { useAccountScrobble } from '../../../queries/accounts/use-account-scrobble'; + import { useRelationship } from './use-relationship'; import type { Account as BaseAccount } from 'pl-api'; diff --git a/packages/pl-fe/src/api/hooks/accounts/use-account.ts b/packages/pl-fe/src/api/hooks/accounts/use-account.ts index 2f27e7ef7..75f0e3ac7 100644 --- a/packages/pl-fe/src/api/hooks/accounts/use-account.ts +++ b/packages/pl-fe/src/api/hooks/accounts/use-account.ts @@ -9,7 +9,8 @@ import { useFeatures } from 'pl-fe/hooks/use-features'; import { useLoggedIn } from 'pl-fe/hooks/use-logged-in'; import { type Account, normalizeAccount } from 'pl-fe/normalizers/account'; -import { useAccountScrobble } from './use-account-scrobble'; +import { useAccountScrobble } from '../../../queries/accounts/use-account-scrobble'; + import { useRelationship } from './use-relationship'; import type { Account as BaseAccount } from 'pl-api'; diff --git a/packages/pl-fe/src/api/hooks/admin/use-announcements.ts b/packages/pl-fe/src/api/hooks/admin/use-announcements.ts deleted file mode 100644 index c313e0895..000000000 --- a/packages/pl-fe/src/api/hooks/admin/use-announcements.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { useMutation, useQuery } from '@tanstack/react-query'; -import { - adminAnnouncementSchema, - type AdminAnnouncement, - type AdminCreateAnnouncementParams, - type AdminUpdateAnnouncementParams, -} from 'pl-api'; -import * as v from 'valibot'; - -import { useClient } from 'pl-fe/hooks/use-client'; -import { queryClient } from 'pl-fe/queries/client'; - -import { useAnnouncements as useUserAnnouncements } from '../announcements/use-announcements'; - -const useAnnouncements = () => { - const client = useClient(); - const userAnnouncements = useUserAnnouncements(); - - const getAnnouncements = async () => { - const data = await client.admin.announcements.getAnnouncements(); - - return data.items; - }; - - const result = useQuery>({ - queryKey: ['admin', 'announcements'], - queryFn: getAnnouncements, - placeholderData: [] as ReadonlyArray, - }); - - const { - mutate: createAnnouncement, - isPending: isCreating, - } = useMutation({ - mutationFn: (params: AdminCreateAnnouncementParams) => client.admin.announcements.createAnnouncement(params), - retry: false, - onSuccess: (data) => - queryClient.setQueryData(['admin', 'announcements'], (prevResult: ReadonlyArray) => - [...prevResult, v.parse(adminAnnouncementSchema, data)], - ), - onSettled: () => userAnnouncements.refetch(), - }); - - const { - mutate: updateAnnouncement, - isPending: isUpdating, - } = useMutation({ - mutationFn: ({ id, ...params }: AdminUpdateAnnouncementParams & { id: string }) => - client.admin.announcements.updateAnnouncement(id, params), - retry: false, - onSuccess: (data) => - queryClient.setQueryData(['admin', 'announcements'], (prevResult: ReadonlyArray) => - prevResult.map((announcement) => announcement.id === data.id ? v.parse(adminAnnouncementSchema, data) : announcement), - ), - onSettled: () => userAnnouncements.refetch(), - }); - - const { - mutate: deleteAnnouncement, - isPending: isDeleting, - } = useMutation({ - mutationFn: (id: string) => client.admin.announcements.deleteAnnouncement(id), - retry: false, - onSuccess: (_, id) => - queryClient.setQueryData(['admin', 'announcements'], (prevResult: ReadonlyArray) => - prevResult.filter(({ id: announcementId }) => announcementId !== id), - ), - onSettled: () => userAnnouncements.refetch(), - }); - - return { - ...result, - createAnnouncement, - isCreating, - updateAnnouncement, - isUpdating, - deleteAnnouncement, - isDeleting, - }; -}; - -export { useAnnouncements }; diff --git a/packages/pl-fe/src/api/hooks/groups/use-block-group-member.ts b/packages/pl-fe/src/api/hooks/groups/use-block-group-member.ts deleted file mode 100644 index 673b261dd..000000000 --- a/packages/pl-fe/src/api/hooks/groups/use-block-group-member.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Entities } from 'pl-fe/entity-store/entities'; -import { useCreateEntity } from 'pl-fe/entity-store/hooks/use-create-entity'; -import { useClient } from 'pl-fe/hooks/use-client'; - -import type { Group } from 'pl-api'; -import type { Account } from 'pl-fe/normalizers/account'; - -const useBlockGroupMember = (group: Pick, account: Pick) => { - const client = useClient(); - - const { createEntity } = useCreateEntity( - [Entities.GROUP_MEMBERSHIPS, account.id], - (accountIds: string[]) => client.experimental.groups.blockGroupUsers(group.id, accountIds), - ); - - return createEntity; -}; - -export { useBlockGroupMember }; diff --git a/packages/pl-fe/src/api/hooks/groups/use-group-members.test.ts b/packages/pl-fe/src/api/hooks/groups/use-group-members.test.ts deleted file mode 100644 index d6dbf53dc..000000000 --- a/packages/pl-fe/src/api/hooks/groups/use-group-members.test.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { GroupRoles } from 'pl-api'; - -import { __stub } from 'pl-fe/api'; -import { buildGroupMember } from 'pl-fe/jest/factory'; -import { renderHook, waitFor } from 'pl-fe/jest/test-helpers'; - -import { useGroupMembers } from './use-group-members'; - -const groupMember = buildGroupMember(); -const groupId = '1'; - -describe('useGroupMembers hook', () => { - describe('with a successful request', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet(`/api/v1/groups/${groupId}/memberships?role=${GroupRoles.ADMIN}`).reply(200, [groupMember]); - }); - }); - - it('is successful', async () => { - const { result } = renderHook(() => useGroupMembers(groupId, GroupRoles.ADMIN)); - - await waitFor(() => expect(result.current.isFetching).toBe(false)); - - expect(result.current.groupMembers.length).toBe(1); - expect(result.current.groupMembers[0].id).toBe(groupMember.id); - }); - }); - - describe('with an unsuccessful query', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet(`/api/v1/groups/${groupId}/memberships?role=${GroupRoles.ADMIN}`).networkError(); - }); - }); - - it('is has error state', async() => { - const { result } = renderHook(() => useGroupMembers(groupId, GroupRoles.ADMIN)); - - await waitFor(() => expect(result.current.isFetching).toBe(false)); - - expect(result.current.groupMembers.length).toBe(0); - expect(result.current.isError).toBeTruthy(); - }); - }); -}); diff --git a/packages/pl-fe/src/api/hooks/groups/use-group-members.ts b/packages/pl-fe/src/api/hooks/groups/use-group-members.ts deleted file mode 100644 index d8e8df888..000000000 --- a/packages/pl-fe/src/api/hooks/groups/use-group-members.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Entities } from 'pl-fe/entity-store/entities'; -import { useEntities } from 'pl-fe/entity-store/hooks/use-entities'; -import { useClient } from 'pl-fe/hooks/use-client'; -import { normalizeGroupMember, type GroupMember } from 'pl-fe/normalizers/group-member'; - -import type { GroupMember as BaseGroupMember, GroupRoles } from 'pl-api'; - -const useGroupMembers = (groupId: string, role: GroupRoles) => { - const client = useClient(); - - const { entities, ...result } = useEntities( - [Entities.GROUP_MEMBERSHIPS, groupId, role], - () => client.experimental.groups.getGroupMemberships(groupId, role), - { transform: normalizeGroupMember }, - ); - - return { - ...result, - groupMembers: entities, - }; -}; - -export { useGroupMembers }; diff --git a/packages/pl-fe/src/api/hooks/statuses/use-bookmark-folder.ts b/packages/pl-fe/src/api/hooks/statuses/use-bookmark-folder.ts deleted file mode 100644 index 79f145aaa..000000000 --- a/packages/pl-fe/src/api/hooks/statuses/use-bookmark-folder.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { useBookmarkFolders } from './use-bookmark-folders'; - -const useBookmarkFolder = (folderId?: string) => useBookmarkFolders((data) => folderId ? data.find(folder => folder.id === folderId) : undefined); - -export { useBookmarkFolder }; diff --git a/packages/pl-fe/src/api/hooks/statuses/use-bookmark-folders.ts b/packages/pl-fe/src/api/hooks/statuses/use-bookmark-folders.ts deleted file mode 100644 index 7e857b1ac..000000000 --- a/packages/pl-fe/src/api/hooks/statuses/use-bookmark-folders.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { useQuery } from '@tanstack/react-query'; - -import { useClient } from 'pl-fe/hooks/use-client'; -import { useFeatures } from 'pl-fe/hooks/use-features'; - -import type { BookmarkFolder } from 'pl-api'; - -const useBookmarkFolders = ( - select?: ((data: Array) => T), -) => { - const client = useClient(); - const features = useFeatures(); - - return useQuery({ - queryKey: ['bookmarkFolders'], - queryFn: () => client.myAccount.getBookmarkFolders(), - enabled: features.bookmarkFolders, - select, - }); -}; - -export { useBookmarkFolders }; diff --git a/packages/pl-fe/src/api/hooks/statuses/use-create-bookmark-folder.ts b/packages/pl-fe/src/api/hooks/statuses/use-create-bookmark-folder.ts deleted file mode 100644 index 0cc9acfc8..000000000 --- a/packages/pl-fe/src/api/hooks/statuses/use-create-bookmark-folder.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { useMutation } from '@tanstack/react-query'; - -import { useClient } from 'pl-fe/hooks/use-client'; -import { queryClient } from 'pl-fe/queries/client'; - -interface CreateBookmarkFolderParams { - name: string; - emoji?: string; -} - -const useCreateBookmarkFolder = () => { - const client = useClient(); - - return useMutation({ - mutationKey: ['bookmarkFolders', 'create'], - mutationFn: (params: CreateBookmarkFolderParams) => client.myAccount.createBookmarkFolder(params), - onSettled: () => queryClient.invalidateQueries({ queryKey: ['bookmarkFolders'] }), - }); -}; - -export { useCreateBookmarkFolder }; diff --git a/packages/pl-fe/src/api/hooks/statuses/use-delete-bookmark-folder.ts b/packages/pl-fe/src/api/hooks/statuses/use-delete-bookmark-folder.ts deleted file mode 100644 index 9c96d5786..000000000 --- a/packages/pl-fe/src/api/hooks/statuses/use-delete-bookmark-folder.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { useMutation } from '@tanstack/react-query'; - -import { useClient } from 'pl-fe/hooks/use-client'; -import { queryClient } from 'pl-fe/queries/client'; - -const useDeleteBookmarkFolder = () => { - const client = useClient(); - - return useMutation({ - mutationKey: ['bookmarkFolders', 'delete'], - mutationFn: (folderId: string) => client.myAccount.deleteBookmarkFolder(folderId), - onSettled: () => queryClient.invalidateQueries({ queryKey: ['bookmarkFolders'] }), - }); -}; - -export { useDeleteBookmarkFolder }; diff --git a/packages/pl-fe/src/api/hooks/statuses/use-status-quotes.ts b/packages/pl-fe/src/api/hooks/statuses/use-status-quotes.ts deleted file mode 100644 index 0fc0d9edd..000000000 --- a/packages/pl-fe/src/api/hooks/statuses/use-status-quotes.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { useInfiniteQuery } from '@tanstack/react-query'; - -import { minifyStatusList } from 'pl-fe/api/normalizers/status-list'; -import { useClient } from 'pl-fe/hooks/use-client'; - -import type { PaginatedResponse } from 'pl-api'; - -const useStatusQuotes = (statusId: string) => { - const client = useClient(); - - return useInfiniteQuery({ - queryKey: ['statusLists', 'quotes', statusId], - queryFn: ({ pageParam }) => pageParam.next?.() || client.statuses.getStatusQuotes(statusId).then(minifyStatusList), - initialPageParam: { previous: null, next: null, items: [], partial: false } as PaginatedResponse, - getNextPageParam: (page) => page.next ? page : undefined, - select: (data) => data.pages.map(page => page.items).flat(), - }); -}; - -export { useStatusQuotes }; diff --git a/packages/pl-fe/src/api/hooks/statuses/use-update-bookmark-folder.ts b/packages/pl-fe/src/api/hooks/statuses/use-update-bookmark-folder.ts deleted file mode 100644 index 13c6b28e9..000000000 --- a/packages/pl-fe/src/api/hooks/statuses/use-update-bookmark-folder.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { useMutation } from '@tanstack/react-query'; - -import { useClient } from 'pl-fe/hooks/use-client'; -import { queryClient } from 'pl-fe/queries/client'; - -interface UpdateBookmarkFolderParams { - name: string; - emoji?: string; -} - -const useUpdateBookmarkFolder = (folderId: string) => { - const client = useClient(); - - return useMutation({ - mutationKey: ['bookmarkFolders', 'update', folderId], - mutationFn: (params: UpdateBookmarkFolderParams) => client.myAccount.updateBookmarkFolder(folderId, params), - onSettled: () => queryClient.invalidateQueries({ queryKey: ['bookmarkFolders'] }), - }); -}; - -export { useUpdateBookmarkFolder }; diff --git a/packages/pl-fe/src/api/hooks/streaming/use-user-stream.ts b/packages/pl-fe/src/api/hooks/streaming/use-user-stream.ts index ac161db0c..8804f0741 100644 --- a/packages/pl-fe/src/api/hooks/streaming/use-user-stream.ts +++ b/packages/pl-fe/src/api/hooks/streaming/use-user-stream.ts @@ -19,7 +19,7 @@ import { useSettingsStore } from 'pl-fe/stores/settings'; import { getUnreadChatsCount, updateChatListItem } from 'pl-fe/utils/chats'; import { play, soundCache } from 'pl-fe/utils/sounds'; -import { updateReactions } from '../announcements/use-announcements'; +import { updateReactions } from '../../../queries/announcements/use-announcements'; import { useTimelineStream } from './use-timeline-stream'; diff --git a/packages/pl-fe/src/api/index.ts b/packages/pl-fe/src/api/index.ts index 819ba870d..efd01cce9 100644 --- a/packages/pl-fe/src/api/index.ts +++ b/packages/pl-fe/src/api/index.ts @@ -14,7 +14,7 @@ type PlfeResponse = Response & { data: string; json: T }; * No authorization is needed. */ const staticFetch = (input: URL | RequestInfo, init?: RequestInit | undefined) => { - const fullPath = buildFullPath(input.toString(), BuildConfig.FE_SUBDIRECTORY); + const fullPath = buildFullPath(input.toString(), BuildConfig.BACKEND_URL); return fetch(fullPath, init).then(async (response) => { if (!response.ok) throw { response }; diff --git a/packages/pl-fe/src/api/normalizers/status-list.ts b/packages/pl-fe/src/api/normalizers/status-list.ts deleted file mode 100644 index 9e8333462..000000000 --- a/packages/pl-fe/src/api/normalizers/status-list.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { PaginatedResponse, Status } from 'pl-api'; - -import { importEntities } from 'pl-fe/actions/importer'; -import { store } from 'pl-fe/store'; - -const minifyStatusList = ({ previous, next, items, ...response }: PaginatedResponse): PaginatedResponse => { - store.dispatch(importEntities({ statuses: items }) as any); - - return { - ...response, - previous: previous ? () => previous().then(minifyStatusList) : null, - next: next ? () => next().then(minifyStatusList) : null, - items: items.map(status => status.id), - }; -}; - -export { minifyStatusList }; diff --git a/packages/pl-fe/src/components/account.tsx b/packages/pl-fe/src/components/account.tsx index ba4434a90..9adb4ff82 100644 --- a/packages/pl-fe/src/components/account.tsx +++ b/packages/pl-fe/src/components/account.tsx @@ -85,7 +85,6 @@ interface IAccount { /** Override other actions for specificity like mute/unmute. */ actionType?: 'muting' | 'blocking' | 'follow_request' | 'biting'; avatarSize?: number; - hidden?: boolean; hideActions?: boolean; id?: string; onActionClick?: (account: AccountSchema) => void; @@ -115,7 +114,6 @@ const Account = ({ actionTitle, actionAlignment = 'center', avatarSize = 42, - hidden = false, hideActions = false, onActionClick, showAccountHoverCard = true, @@ -181,15 +179,6 @@ const Account = ({ return null; } - if (hidden) { - return ( - <> - {account.display_name} - {account.username} - - ); - } - if (withDate) timestamp = account.created_at; const LinkEl: any = withLinkToProfile ? Link : 'div'; @@ -234,7 +223,7 @@ const Account = ({ @{username} {account.favicon && ( - + )} {items} diff --git a/packages/pl-fe/src/components/announcements/announcements-panel.tsx b/packages/pl-fe/src/components/announcements/announcements-panel.tsx index ecbddd826..cb1d6c511 100644 --- a/packages/pl-fe/src/components/announcements/announcements-panel.tsx +++ b/packages/pl-fe/src/components/announcements/announcements-panel.tsx @@ -2,23 +2,21 @@ import clsx from 'clsx'; import React, { useState } from 'react'; import { FormattedMessage } from 'react-intl'; import ReactSwipeableViews from 'react-swipeable-views'; -import { createSelector } from 'reselect'; -import { useAnnouncements } from 'pl-fe/api/hooks/announcements/use-announcements'; import Card from 'pl-fe/components/ui/card'; import HStack from 'pl-fe/components/ui/hstack'; import Widget from 'pl-fe/components/ui/widget'; -import { useAppSelector } from 'pl-fe/hooks/use-app-selector'; +import { useAnnouncements } from 'pl-fe/queries/announcements/use-announcements'; +import { useCustomEmojis } from 'pl-fe/queries/instance/use-custom-emojis'; import Announcement from './announcement'; import type { CustomEmoji } from 'pl-api'; -import type { RootState } from 'pl-fe/store'; -const customEmojiMap = createSelector([(state: RootState) => state.custom_emojis], items => items.reduce>((map, emoji) => (map[emoji.shortcode] = emoji, map), {})); +const makeCustomEmojiMap = (items: Array) => items.reduce>((map, emoji) => (map[emoji.shortcode] = emoji, map), {}); const AnnouncementsPanel = () => { - const emojiMap = useAppSelector(state => customEmojiMap(state)); + const { data: emojiMap = {} } = useCustomEmojis(makeCustomEmojiMap); const [index, setIndex] = useState(0); const { data: announcements } = useAnnouncements(); diff --git a/packages/pl-fe/src/components/announcements/reaction.tsx b/packages/pl-fe/src/components/announcements/reaction.tsx index 99ba3b790..ac6d817c2 100644 --- a/packages/pl-fe/src/components/announcements/reaction.tsx +++ b/packages/pl-fe/src/components/announcements/reaction.tsx @@ -1,9 +1,9 @@ import clsx from 'clsx'; import React, { useState } from 'react'; -import { useAnnouncements } from 'pl-fe/api/hooks/announcements/use-announcements'; import AnimatedNumber from 'pl-fe/components/animated-number'; import unicodeMapping from 'pl-fe/features/emoji/mapping'; +import { useAnnouncements } from 'pl-fe/queries/announcements/use-announcements'; import Emoji from './emoji'; diff --git a/packages/pl-fe/src/components/announcements/reactions-bar.tsx b/packages/pl-fe/src/components/announcements/reactions-bar.tsx index d0db5971b..3d56c774d 100644 --- a/packages/pl-fe/src/components/announcements/reactions-bar.tsx +++ b/packages/pl-fe/src/components/announcements/reactions-bar.tsx @@ -1,9 +1,9 @@ import React from 'react'; import { TransitionMotion, spring } from 'react-motion'; -import { useAnnouncements } from 'pl-fe/api/hooks/announcements/use-announcements'; import EmojiPickerDropdown from 'pl-fe/features/emoji/containers/emoji-picker-dropdown-container'; import { useSettings } from 'pl-fe/hooks/use-settings'; +import { useAnnouncements } from 'pl-fe/queries/announcements/use-announcements'; import Reaction from './reaction'; diff --git a/packages/pl-fe/src/components/autosuggest-account-input.tsx b/packages/pl-fe/src/components/autosuggest-account-input.tsx index aa75dae6f..fadff8f28 100644 --- a/packages/pl-fe/src/components/autosuggest-account-input.tsx +++ b/packages/pl-fe/src/components/autosuggest-account-input.tsx @@ -11,6 +11,7 @@ import type { InputThemes } from 'pl-fe/components/ui/input'; const noOp = () => { }; interface IAutosuggestAccountInput { + id?: string; onChange: React.ChangeEventHandler; onSelected: (accountId: string) => void; autoFocus?: boolean; diff --git a/packages/pl-fe/src/components/birthday-panel.tsx b/packages/pl-fe/src/components/birthday-panel.tsx index 68115e5db..33f7d6f7a 100644 --- a/packages/pl-fe/src/components/birthday-panel.tsx +++ b/packages/pl-fe/src/components/birthday-panel.tsx @@ -1,11 +1,9 @@ -import React, { useRef } from 'react'; +import React, { useRef, useState } from 'react'; import { FormattedMessage } from 'react-intl'; -import { fetchBirthdayReminders } from 'pl-fe/actions/accounts'; import Widget from 'pl-fe/components/ui/widget'; import AccountContainer from 'pl-fe/containers/account-container'; -import { useAppDispatch } from 'pl-fe/hooks/use-app-dispatch'; -import { useAppSelector } from 'pl-fe/hooks/use-app-selector'; +import { useBirthdayReminders } from 'pl-fe/queries/accounts/use-birthday-reminders'; const timeToMidnight = () => { const now = new Date(); @@ -14,31 +12,36 @@ const timeToMidnight = () => { return midnight.getTime() - now.getTime(); }; +const getCurrentDate = () => { + const date = new Date(); + + const day = date.getDate(); + const month = date.getMonth() + 1; + + return [day, month]; +}; + interface IBirthdayPanel { limit: number; } const BirthdayPanel = ({ limit }: IBirthdayPanel) => { - const dispatch = useAppDispatch(); + const [[day, month], setDate] = useState(getCurrentDate); - const birthdays = useAppSelector(state => state.user_lists.birthday_reminders[state.me as string]?.items || []); + const { data: birthdays = [] } = useBirthdayReminders(month, day); const birthdaysToRender = birthdays.slice(0, limit); const timeout = useRef(); - const handleFetchBirthdayReminders = () => { - const date = new Date(); - - const day = date.getDate(); - const month = date.getMonth() + 1; - - dispatch(fetchBirthdayReminders(month, day))?.then(() => { - timeout.current = setTimeout(() => handleFetchBirthdayReminders(), timeToMidnight()); - }); - }; - React.useEffect(() => { - handleFetchBirthdayReminders(); + const updateTimeout = () => { + timeout.current = setTimeout(() => { + setDate(getCurrentDate); + updateTimeout(); + }, timeToMidnight()); + }; + + updateTimeout(); return () => { if (timeout.current) { @@ -65,4 +68,4 @@ const BirthdayPanel = ({ limit }: IBirthdayPanel) => { ); }; -export { BirthdayPanel as default }; +export { BirthdayPanel as default, getCurrentDate }; diff --git a/packages/pl-fe/src/components/location-search.tsx b/packages/pl-fe/src/components/location-search.tsx index 7e1a19530..4766a10a8 100644 --- a/packages/pl-fe/src/components/location-search.tsx +++ b/packages/pl-fe/src/components/location-search.tsx @@ -3,9 +3,9 @@ import clsx from 'clsx'; import React, { useState } from 'react'; import { defineMessages, useIntl } from 'react-intl'; -import { useSearchLocation } from 'pl-fe/api/hooks/search/use-search-location'; import AutosuggestInput, { AutoSuggestion } from 'pl-fe/components/autosuggest-input'; import Icon from 'pl-fe/components/icon'; +import { useSearchLocation } from 'pl-fe/queries/search/use-search-location'; import type { Location } from 'pl-api'; diff --git a/packages/pl-fe/src/components/search-input.tsx b/packages/pl-fe/src/components/search-input.tsx index 11460b297..36e571bf6 100644 --- a/packages/pl-fe/src/components/search-input.tsx +++ b/packages/pl-fe/src/components/search-input.tsx @@ -78,6 +78,7 @@ const SearchInput = () => {
{ const { account } = useAccount(me || undefined); const otherAccounts = useAppSelector((state) => getOtherAccounts(state)); const { settings } = useSettingsStore(); - const followRequestsCount = useAppSelector((state) => state.user_lists.follow_requests.items.length); + const followRequestsCount = useFollowRequestsCount().data || 0; const interactionRequestsCount = useInteractionRequestsCount().data || 0; const scheduledStatusCount = useAppSelector((state) => Object.keys(state.scheduled_statuses).length); const draftCount = useAppSelector((state) => Object.keys(state.draft_statuses).length); diff --git a/packages/pl-fe/src/components/sidebar-navigation.tsx b/packages/pl-fe/src/components/sidebar-navigation.tsx index e24dfecb1..34d3a88a1 100644 --- a/packages/pl-fe/src/components/sidebar-navigation.tsx +++ b/packages/pl-fe/src/components/sidebar-navigation.tsx @@ -1,7 +1,6 @@ import React from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; -import { useInteractionRequestsCount } from 'pl-fe/api/hooks/statuses/use-interaction-requests'; import Icon from 'pl-fe/components/ui/icon'; import Stack from 'pl-fe/components/ui/stack'; import { useStatContext } from 'pl-fe/contexts/stat-context'; @@ -14,6 +13,8 @@ import { useLogo } from 'pl-fe/hooks/use-logo'; import { useOwnAccount } from 'pl-fe/hooks/use-own-account'; import { useRegistrationStatus } from 'pl-fe/hooks/use-registration-status'; import { useSettings } from 'pl-fe/hooks/use-settings'; +import { useFollowRequestsCount } from 'pl-fe/queries/accounts/use-follow-requests'; +import { useInteractionRequestsCount } from 'pl-fe/queries/statuses/use-interaction-requests'; import Account from './account'; import DropdownMenu, { Menu } from './dropdown-menu'; @@ -48,7 +49,7 @@ const SidebarNavigation = () => { const logoSrc = useLogo(); const notificationCount = useAppSelector((state) => state.notifications.unread); - const followRequestsCount = useAppSelector((state) => state.user_lists.follow_requests.items.length); + const followRequestsCount = useFollowRequestsCount().data || 0; const interactionRequestsCount = useInteractionRequestsCount().data || 0; const dashboardCount = useAppSelector((state) => state.admin.openReports.length + state.admin.awaitingApproval.length); const scheduledStatusCount = useAppSelector((state) => Object.keys(state.scheduled_statuses).length); @@ -172,6 +173,7 @@ const SidebarNavigation = () => { account={account} action={} disabled + withLinkToProfile={false} />
diff --git a/packages/pl-fe/src/components/status-action-bar.tsx b/packages/pl-fe/src/components/status-action-bar.tsx index 413173f89..0554dc5c8 100644 --- a/packages/pl-fe/src/components/status-action-bar.tsx +++ b/packages/pl-fe/src/components/status-action-bar.tsx @@ -1,8 +1,7 @@ -import { GroupRoles } from 'pl-api'; +import { type CustomEmoji, GroupRoles } from 'pl-api'; import React, { useMemo } from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; import { useHistory, useRouteMatch } from 'react-router-dom'; -import { createSelector } from 'reselect'; import { blockAccount } from 'pl-fe/actions/accounts'; import { directCompose, mentionCompose, quoteCompose, replyCompose } from 'pl-fe/actions/compose'; @@ -13,11 +12,9 @@ import { initReport, ReportableEntities } from 'pl-fe/actions/reports'; import { changeSetting } from 'pl-fe/actions/settings'; import { deleteStatus, editStatus, toggleMuteStatus } from 'pl-fe/actions/statuses'; import { deleteFromTimelines } from 'pl-fe/actions/timelines'; -import { useBlockGroupMember } from 'pl-fe/api/hooks/groups/use-block-group-member'; import { useDeleteGroupStatus } from 'pl-fe/api/hooks/groups/use-delete-group-status'; import { useGroup } from 'pl-fe/api/hooks/groups/use-group'; import { useGroupRelationship } from 'pl-fe/api/hooks/groups/use-group-relationship'; -import { useTranslationLanguages } from 'pl-fe/api/hooks/instance/use-translation-languages'; import DropdownMenu from 'pl-fe/components/dropdown-menu'; import StatusActionButton from 'pl-fe/components/status-action-button'; import HStack from 'pl-fe/components/ui/hstack'; @@ -31,7 +28,9 @@ import { useInstance } from 'pl-fe/hooks/use-instance'; import { useOwnAccount } from 'pl-fe/hooks/use-own-account'; import { useSettings } from 'pl-fe/hooks/use-settings'; import { useChats } from 'pl-fe/queries/chats'; -import { RootState } from 'pl-fe/store'; +import { useBlockGroupUserMutation } from 'pl-fe/queries/groups/use-group-blocks'; +import { useCustomEmojis } from 'pl-fe/queries/instance/use-custom-emojis'; +import { useTranslationLanguages } from 'pl-fe/queries/instance/use-translation-languages'; import { useModalsStore } from 'pl-fe/stores/modals'; import { useStatusMetaStore } from 'pl-fe/stores/status-meta'; import toast from 'pl-fe/toast'; @@ -463,10 +462,7 @@ const DislikeButton: React.FC = ({ ); }; -const getLongerWrench = createSelector( - [(state: RootState) => state.custom_emojis], - (emojis) => emojis.find(({ shortcode }) => shortcode === 'longestest_wrench') || emojis.find(({ shortcode }) => shortcode === 'longest_wrench'), -); +const getLongerWrench = (emojis: Array) => emojis.find(({ shortcode }) => shortcode === 'longestest_wrench') || emojis.find(({ shortcode }) => shortcode === 'longest_wrench'); const WrenchButton: React.FC = ({ status, @@ -481,7 +477,7 @@ const WrenchButton: React.FC = ({ const { openModal } = useModalsStore(); const { showWrenchButton } = useSettings(); - const hasLongerWrench = useAppSelector(getLongerWrench); + const { data: hasLongerWrench } = useCustomEmojis(getLongerWrench); if (!me || withLabels || !features.emojiReacts || !showWrenchButton) return; @@ -590,7 +586,7 @@ const MenuButton: React.FC = ({ const { openModal } = useModalsStore(); const { group } = useGroup((status.group as Group)?.id as string); const deleteGroupStatus = useDeleteGroupStatus(group as Group, status.id); - const blockGroupMember = useBlockGroupMember(group as Group, status.account); + const { mutate: blockGroupMember } = useBlockGroupUserMutation(status.group?.id as string, status.account.id); const { getOrCreateChatByAccountId } = useChats(); const { groupRelationship } = useGroupRelationship(status.group_id || undefined); @@ -762,8 +758,8 @@ const MenuButton: React.FC = ({ message: intl.formatMessage(messages.groupBlockFromGroupMessage, { name: status.account.username }), confirm: intl.formatMessage(messages.groupBlockConfirm), onConfirm: () => { - blockGroupMember([status.account_id], { - onSuccess() { + blockGroupMember(undefined, { + onSuccess: () => { toast.success(intl.formatMessage(messages.blocked, { name: account?.acct })); }, }); diff --git a/packages/pl-fe/src/components/status-content.tsx b/packages/pl-fe/src/components/status-content.tsx index 966889c42..d429f5669 100644 --- a/packages/pl-fe/src/components/status-content.tsx +++ b/packages/pl-fe/src/components/status-content.tsx @@ -2,7 +2,6 @@ import clsx from 'clsx'; import React, { useState, useRef, useLayoutEffect, useMemo, useEffect } from 'react'; import { FormattedMessage } from 'react-intl'; -import { useStatusTranslation } from 'pl-fe/api/hooks/statuses/use-status-translation'; import Icon from 'pl-fe/components/icon'; import Button from 'pl-fe/components/ui/button'; import Stack from 'pl-fe/components/ui/stack'; @@ -10,6 +9,7 @@ import Text from 'pl-fe/components/ui/text'; import Emojify from 'pl-fe/features/emoji/emojify'; import QuotedStatus from 'pl-fe/features/status/containers/quoted-status-container'; import { useSettings } from 'pl-fe/hooks/use-settings'; +import { useStatusTranslation } from 'pl-fe/queries/statuses/use-status-translation'; import { useStatusMetaStore } from 'pl-fe/stores/status-meta'; import { onlyEmoji as isOnlyEmoji } from 'pl-fe/utils/rich-content'; diff --git a/packages/pl-fe/src/components/status.tsx b/packages/pl-fe/src/components/status.tsx index 2a0296326..645355415 100644 --- a/packages/pl-fe/src/components/status.tsx +++ b/packages/pl-fe/src/components/status.tsx @@ -29,6 +29,7 @@ import StatusLanguagePicker from './status-language-picker'; import StatusReactionsBar from './status-reactions-bar'; import StatusReplyMentions from './status-reply-mentions'; import StatusInfo from './statuses/status-info'; +import Tombstone from './tombstone'; const messages = defineMessages({ reblogged_by: { id: 'status.reblogged_by', defaultMessage: '{name} reposted' }, @@ -40,7 +41,6 @@ interface IStatus { status: SelectedStatus; onClick?: () => void; muted?: boolean; - hidden?: boolean; unread?: boolean; onMoveUp?: (statusId: string, featured?: boolean) => void; onMoveDown?: (statusId: string, featured?: boolean) => void; @@ -65,7 +65,6 @@ const Status: React.FC = (props) => { onMoveUp, onMoveDown, muted, - hidden, featured, unread, hideActionBar, @@ -95,7 +94,7 @@ const Status: React.FC = (props) => { // Track height changes we know about to compensate scrolling. useEffect(() => { - didShowCard.current = Boolean(!muted && !hidden && status?.card); + didShowCard.current = Boolean(!muted && status?.card); }, []); const handleClick = (e?: React.MouseEvent) => { @@ -299,16 +298,9 @@ const Status: React.FC = (props) => { if (!status) return null; - if (hidden) { - return ( -
- <> - {actualStatus.account.display_name || actualStatus.account.username} - {actualStatus.content} - -
- ); - } + if (status.deleted) return ( + + ); if (filtered && status.showFiltered !== false) { const minHandlers = muted ? undefined : { diff --git a/packages/pl-fe/src/components/tombstone.tsx b/packages/pl-fe/src/components/tombstone.tsx index d9078a476..a1b20c460 100644 --- a/packages/pl-fe/src/components/tombstone.tsx +++ b/packages/pl-fe/src/components/tombstone.tsx @@ -8,10 +8,11 @@ interface ITombstone { id: string; onMoveUp?: (statusId: string) => void; onMoveDown?: (statusId: string) => void; + deleted?: boolean; } /** Represents a deleted item. */ -const Tombstone: React.FC = ({ id, onMoveUp, onMoveDown }) => { +const Tombstone: React.FC = ({ id, onMoveUp, onMoveDown, deleted }) => { const handlers = { moveUp: () => onMoveUp?.(id), moveDown: () => onMoveDown?.(id), @@ -25,10 +26,9 @@ const Tombstone: React.FC = ({ id, onMoveUp, onMoveDown }) => { tabIndex={0} > - + {deleted + ? + : } diff --git a/packages/pl-fe/src/components/translate-button.tsx b/packages/pl-fe/src/components/translate-button.tsx index 3d8e41198..32eab1807 100644 --- a/packages/pl-fe/src/components/translate-button.tsx +++ b/packages/pl-fe/src/components/translate-button.tsx @@ -1,8 +1,6 @@ import React, { useEffect } from 'react'; import { FormattedMessage, useIntl } from 'react-intl'; -import { useTranslationLanguages } from 'pl-fe/api/hooks/instance/use-translation-languages'; -import { useStatusTranslation } from 'pl-fe/api/hooks/statuses/use-status-translation'; import HStack from 'pl-fe/components/ui/hstack'; import Icon from 'pl-fe/components/ui/icon'; import Stack from 'pl-fe/components/ui/stack'; @@ -11,6 +9,8 @@ import { useAppSelector } from 'pl-fe/hooks/use-app-selector'; import { useFeatures } from 'pl-fe/hooks/use-features'; import { useInstance } from 'pl-fe/hooks/use-instance'; import { useSettings } from 'pl-fe/hooks/use-settings'; +import { useTranslationLanguages } from 'pl-fe/queries/instance/use-translation-languages'; +import { useStatusTranslation } from 'pl-fe/queries/statuses/use-status-translation'; import { useStatusMetaStore } from 'pl-fe/stores/status-meta'; import type { Status } from 'pl-fe/normalizers/status'; diff --git a/packages/pl-fe/src/components/upload.tsx b/packages/pl-fe/src/components/upload.tsx index 095407f05..65b238e03 100644 --- a/packages/pl-fe/src/components/upload.tsx +++ b/packages/pl-fe/src/components/upload.tsx @@ -237,7 +237,7 @@ const Upload: React.FC = ({ /> )} -
+
{mediaType === 'video' && (