~cytrogen/masto-fe

919ed0e469b70e373ab7e79ae30c030e4b66e9e5 — Renaud Chaput 2 years ago b2d67fb
[Glitch] Convert `dropdown_menu` state to Typescript

Port 4b7bc1f07c712cf2375882da4f12a8af29444590 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
D app/javascript/flavours/glitch/actions/dropdown_menu.js => app/javascript/flavours/glitch/actions/dropdown_menu.js +0 -10
@@ 1,10 0,0 @@
export const DROPDOWN_MENU_OPEN = 'DROPDOWN_MENU_OPEN';
export const DROPDOWN_MENU_CLOSE = 'DROPDOWN_MENU_CLOSE';

export function openDropdownMenu(id, keyboard, scroll_key) {
  return { type: DROPDOWN_MENU_OPEN, id, keyboard, scroll_key };
}

export function closeDropdownMenu(id) {
  return { type: DROPDOWN_MENU_CLOSE, id };
}

A app/javascript/flavours/glitch/actions/dropdown_menu.ts => app/javascript/flavours/glitch/actions/dropdown_menu.ts +11 -0
@@ 0,0 1,11 @@
import { createAction } from '@reduxjs/toolkit';

export const openDropdownMenu = createAction<{
  id: string;
  keyboard: boolean;
  scrollKey: string;
}>('dropdownMenu/open');

export const closeDropdownMenu = createAction<{ id: string }>(
  'dropdownMenu/close',
);

M app/javascript/flavours/glitch/components/edited_timestamp/containers/dropdown_menu_container.js => app/javascript/flavours/glitch/components/edited_timestamp/containers/dropdown_menu_container.js +9 -4
@@ 4,9 4,14 @@ import { openDropdownMenu, closeDropdownMenu } from 'flavours/glitch/actions/dro
import { fetchHistory } from 'flavours/glitch/actions/history';
import DropdownMenu from 'flavours/glitch/components/dropdown_menu';

/**
 *
 * @param {import('flavours/glitch/store').RootState} state
 * @param {*} props
 */
const mapStateToProps = (state, { statusId }) => ({
  openDropdownId: state.getIn(['dropdown_menu', 'openId']),
  openedViaKeyboard: state.getIn(['dropdown_menu', 'keyboard']),
  openDropdownId: state.dropdownMenu.openId,
  openedViaKeyboard: state.dropdownMenu.keyboard,
  items: state.getIn(['history', statusId, 'items']),
  loading: state.getIn(['history', statusId, 'loading']),
});


@@ 15,11 20,11 @@ const mapDispatchToProps = (dispatch, { statusId }) => ({

  onOpen (id, onItemClick, keyboard) {
    dispatch(fetchHistory(statusId));
    dispatch(openDropdownMenu(id, keyboard));
    dispatch(openDropdownMenu({ id, keyboard }));
  },

  onClose (id) {
    dispatch(closeDropdownMenu(id));
    dispatch(closeDropdownMenu({ id }));
  },

});

M app/javascript/flavours/glitch/components/scrollable_list.jsx => app/javascript/flavours/glitch/components/scrollable_list.jsx +6 -1
@@ 23,9 23,14 @@ const MOUSE_IDLE_DELAY = 300;

const listenerOptions = supportsPassiveEvents ? { passive: true } : false;

/**
 *
 * @param {import('flavours/glitch/store').RootState} state
 * @param {*} props
 */
const mapStateToProps = (state, { scrollKey }) => {
  return {
    preventScroll: scrollKey === state.getIn(['dropdown_menu', 'scroll_key']),
    preventScroll: scrollKey === state.dropdownMenu.scrollKey,
  };
};


M app/javascript/flavours/glitch/containers/dropdown_menu_container.js => app/javascript/flavours/glitch/containers/dropdown_menu_container.js +7 -4
@@ 6,9 6,12 @@ import DropdownMenu from 'flavours/glitch/components/dropdown_menu';

import { isUserTouching } from '../is_mobile';

/**
 * @param {import('flavours/glitch/store').RootState} state
 */
const mapStateToProps = state => ({
  openDropdownId: state.getIn(['dropdown_menu', 'openId']),
  openedViaKeyboard: state.getIn(['dropdown_menu', 'keyboard']),
  openDropdownId: state.dropdownMenu.openId,
  openedViaKeyboard: state.dropdownMenu.keyboard,
});

const mapDispatchToProps = (dispatch, { status, items, scrollKey }) => ({


@@ 20,7 23,7 @@ const mapDispatchToProps = (dispatch, { status, items, scrollKey }) => ({
        actions: items,
        onClick: onItemClick,
      },
    }) : openDropdownMenu(id, keyboard, scrollKey));
    }) : openDropdownMenu({ id, keyboard, scrollKey }));
  },

  onClose(id) {


@@ 28,7 31,7 @@ const mapDispatchToProps = (dispatch, { status, items, scrollKey }) => ({
      modalType: 'ACTIONS',
      ignoreFocus: false,
    }));
    dispatch(closeDropdownMenu(id));
    dispatch(closeDropdownMenu({ id }));
  },
});


M app/javascript/flavours/glitch/features/ui/index.jsx => app/javascript/flavours/glitch/features/ui/index.jsx +1 -1
@@ 80,7 80,7 @@ const mapStateToProps = state => ({
  hasMediaAttachments: state.getIn(['compose', 'media_attachments']).size > 0,
  canUploadMore: !state.getIn(['compose', 'media_attachments']).some(x => ['audio', 'video'].includes(x.get('type'))) && state.getIn(['compose', 'media_attachments']).size < 4,
  isWide: state.getIn(['local_settings', 'stretch']),
  dropdownMenuIsOpen: state.getIn(['dropdown_menu', 'openId']) !== null,
  dropdownMenuIsOpen: state.dropdownMenu.openId !== null,
  unreadNotifications: state.getIn(['notifications', 'unread']),
  showFaviconBadge: state.getIn(['local_settings', 'notifications', 'favicon_badge']),
  hicolorPrivacyIcons: state.getIn(['local_settings', 'hicolor_privacy_icons']),

D app/javascript/flavours/glitch/reducers/dropdown_menu.js => app/javascript/flavours/glitch/reducers/dropdown_menu.js +0 -19
@@ 1,19 0,0 @@
import Immutable from 'immutable';

import {
  DROPDOWN_MENU_OPEN,
  DROPDOWN_MENU_CLOSE,
} from '../actions/dropdown_menu';

const initialState = Immutable.Map({ openId: null, keyboard: false, scroll_key: null });

export default function dropdownMenu(state = initialState, action) {
  switch (action.type) {
  case DROPDOWN_MENU_OPEN:
    return state.merge({ openId: action.id, keyboard: action.keyboard, scroll_key: action.scroll_key });
  case DROPDOWN_MENU_CLOSE:
    return state.get('openId') === action.id ? state.set('openId', null).set('scroll_key', null) : state;
  default:
    return state;
  }
}

A app/javascript/flavours/glitch/reducers/dropdown_menu.ts => app/javascript/flavours/glitch/reducers/dropdown_menu.ts +33 -0
@@ 0,0 1,33 @@
import { createReducer } from '@reduxjs/toolkit';

import { closeDropdownMenu, openDropdownMenu } from '../actions/dropdown_menu';

interface DropdownMenuState {
  openId: string | null;
  keyboard: boolean;
  scrollKey: string | null;
}

const initialState: DropdownMenuState = {
  openId: null,
  keyboard: false,
  scrollKey: null,
};

export const dropdownMenuReducer = createReducer(initialState, (builder) => {
  builder
    .addCase(
      openDropdownMenu,
      (state, { payload: { id, keyboard, scrollKey } }) => {
        state.openId = id;
        state.keyboard = keyboard;
        state.scrollKey = scrollKey;
      },
    )
    .addCase(closeDropdownMenu, (state, { payload: { id } }) => {
      if (state.openId === id) {
        state.openId = null;
        state.scrollKey = null;
      }
    });
});

M app/javascript/flavours/glitch/reducers/index.ts => app/javascript/flavours/glitch/reducers/index.ts +2 -2
@@ 16,7 16,7 @@ import contexts from './contexts';
import conversations from './conversations';
import custom_emojis from './custom_emojis';
import domain_lists from './domain_lists';
import dropdown_menu from './dropdown_menu';
import { dropdownMenuReducer } from './dropdown_menu';
import filters from './filters';
import followed_tags from './followed_tags';
import height_cache from './height_cache';


@@ 49,7 49,7 @@ import user_lists from './user_lists';

const reducers = {
  announcements,
  dropdown_menu,
  dropdownMenu: dropdownMenuReducer,
  timelines,
  meta,
  alerts,