From 64c3402bd7db6d7c364ec67d4bea1d187ff0704b Mon Sep 17 00:00:00 2001 From: moonrailgun Date: Sun, 15 Aug 2021 18:08:20 +0800 Subject: [PATCH] refactor: fullmodalfield and group summary --- web/src/components/FullModalField.tsx | 141 ++++++++++++++++++ .../components/modals/GroupDetail/Summary.tsx | 45 +++++- 2 files changed, 184 insertions(+), 2 deletions(-) create mode 100644 web/src/components/FullModalField.tsx diff --git a/web/src/components/FullModalField.tsx b/web/src/components/FullModalField.tsx new file mode 100644 index 00000000..f991f2a5 --- /dev/null +++ b/web/src/components/FullModalField.tsx @@ -0,0 +1,141 @@ +import React, { useState, useCallback, useEffect } from 'react'; +import _isString from 'lodash/isString'; +import _isNil from 'lodash/isNil'; +import { Button, Input } from 'antd'; +import { Icon } from '@iconify/react'; + +export type FullModalFieldEditorRenderComponent = React.FC<{ + value: string; + onChange: (val: string) => void; +}>; + +interface FullModalFieldProps { + /** + * 字段标题 + */ + title: React.ReactNode; + + /** + * 字段内容 + * 如果没有则向下取value的值 + */ + content?: React.ReactNode; + + /** + * 是否可编辑 + */ + editable?: boolean; + + /** + * 如果可编辑则必填 + * 用于告知组件当前的值 + */ + value?: string; + + /** + * 渲染编辑视图的编辑器 + */ + renderEditor?: FullModalFieldEditorRenderComponent; + + /** + * 编辑完成后的回调 + */ + onSave?: (val: string) => void; +} + +/** + * 字段编辑器 + */ +const FullModalFieldEditor: React.FC = React.memo( + (props) => { + const [isEditing, setIsEditing] = useState(false); + const [editingValue, setEditingValue] = useState(props.value ?? ''); + + useEffect(() => { + setEditingValue(props.value ?? ''); + }, [props.value]); + + const handleEditing = useCallback(() => { + setIsEditing(!isEditing); + }, [isEditing]); + + const handleSave = useCallback(() => { + props.onSave?.(editingValue); + setIsEditing(false); + }, [props.onSave, editingValue]); + + const EditorComponent = props.renderEditor; + + return ( +
+ {isEditing && !_isNil(EditorComponent) ? ( + + ) : ( + {props.content ?? props.value} + )} + +
+ ); + } +); +FullModalFieldEditor.displayName = 'FullModalFieldEditor'; + +export const FullModalField: React.FC = React.memo( + (props) => { + const valueTitle = _isString(props.value) ? props.value : undefined; + + const allowEditor = props.editable === true && !_isNil(props.renderEditor); + + return ( +
+
{props.title}
+
+ {allowEditor === true ? ( + + ) : ( + {props.content ?? props.value} + )} +
+
+ ); + } +); +FullModalField.displayName = 'FullModalField'; + +/** + * 默认的输入框字段编辑器 + */ +export const DefaultFullModalInputEditorRender: FullModalFieldEditorRenderComponent = + ({ value, onChange }) => ( + onChange(e.target.value)} /> + ); + +/** + * 默认的多行输入框字段编辑器 + */ +export const DefaultFullModalTextAreaEditorRender: FullModalFieldEditorRenderComponent = + ({ value, onChange }) => ( + onChange(e.target.value)} + /> + ); diff --git a/web/src/components/modals/GroupDetail/Summary.tsx b/web/src/components/modals/GroupDetail/Summary.tsx index 6591bc8b..06c8d252 100644 --- a/web/src/components/modals/GroupDetail/Summary.tsx +++ b/web/src/components/modals/GroupDetail/Summary.tsx @@ -1,8 +1,49 @@ +import { Avatar } from '@/components/Avatar'; +import { + DefaultFullModalInputEditorRender, + FullModalField, +} from '@/components/FullModalField'; +import { NoData } from '@/components/NoData'; import React from 'react'; +import { + modifyGroupField, + t, + useAsyncRequest, + useGroupInfo, +} from 'tailchat-shared'; export const GroupSummary: React.FC<{ groupId: string; -}> = React.memo((props) => { - return
GroupSummary: {props.groupId}
; +}> = React.memo(({ groupId }) => { + const groupInfo = useGroupInfo(groupId); + + const [, handleUpdateGroupName] = useAsyncRequest( + async (newName: string) => { + await modifyGroupField(groupId, 'name', newName); + }, + [groupId] + ); + + if (!groupInfo) { + return ; + } + + return ( +
+
+ +
+ +
+ +
+
+ ); }); GroupSummary.displayName = 'GroupSummary';