diff --git a/web/modals/threads/members/member.react.js b/web/modals/threads/members/member.react.js
new file mode 100644
--- /dev/null
+++ b/web/modals/threads/members/member.react.js
@@ -0,0 +1,84 @@
+// @flow
+
+import classNames from 'classnames';
+import * as React from 'react';
+
+import { memberIsAdmin, memberHasAdminPowers } from 'lib/shared/thread-utils';
+import { stringForUser } from 'lib/shared/user-utils';
+import {
+ type RelativeMemberInfo,
+ type ThreadInfo,
+} from 'lib/types/thread-types';
+
+import Label from '../../../components/label.react';
+import Menu from '../../../components/menu.react';
+import SWMansionIcon from '../../../SWMansionIcon.react';
+import css from './members-modal.css';
+
+type Props = {
+ +memberInfo: RelativeMemberInfo,
+ +threadInfo: ThreadInfo,
+ +setOpenMenu: (((?string) => ?string)) => void,
+ +isMenuOpen: boolean,
+};
+
+function ThreadMember(props: Props): React.Node {
+ const { memberInfo, threadInfo, setOpenMenu, isMenuOpen } = props;
+ const userName = stringForUser(memberInfo);
+
+ const onMenuChange = React.useCallback(
+ menuOpen => {
+ if (menuOpen) {
+ setOpenMenu(() => memberInfo.id);
+ } else {
+ setOpenMenu(menu => {
+ if (menu !== memberInfo.id) {
+ return menu;
+ } else {
+ return null;
+ }
+ });
+ }
+ },
+ [memberInfo.id, setOpenMenu],
+ );
+
+ const menuItems = [];
+
+ const userSettingsIcon = React.useMemo(
+ () =>