mirror of
https://github.com/roleypoly/roleypoly.git
synced 2025-04-25 11:59:11 +00:00
feat: add server message in editor
This commit is contained in:
parent
be16da1686
commit
1829035694
4 changed files with 54 additions and 8 deletions
|
@ -1,8 +1,9 @@
|
||||||
import { palette } from '@roleypoly/design-system/atoms/colors';
|
import { palette } from '@roleypoly/design-system/atoms/colors';
|
||||||
|
import { fontCSS } from '@roleypoly/design-system/atoms/fonts';
|
||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import styled from 'styled-components';
|
import styled, { css } from 'styled-components';
|
||||||
|
|
||||||
const StyledTextInput = styled.input`
|
const common = css`
|
||||||
appearance: none;
|
appearance: none;
|
||||||
border: 1px solid ${palette.taupe200};
|
border: 1px solid ${palette.taupe200};
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
|
@ -39,11 +40,14 @@ const StyledTextInput = styled.input`
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
type TextInputProps = React.InputHTMLAttributes<HTMLInputElement> & {
|
const StyledTextInput = styled.input`
|
||||||
_override?: React.Component;
|
${common};
|
||||||
};
|
`;
|
||||||
|
|
||||||
export const TextInput = (props: TextInputProps) => {
|
type TextInputProps<T extends HTMLInputElement | HTMLTextAreaElement> =
|
||||||
|
React.InputHTMLAttributes<T>;
|
||||||
|
|
||||||
|
export const TextInput = (props: TextInputProps<HTMLInputElement>) => {
|
||||||
const { ...rest } = props;
|
const { ...rest } = props;
|
||||||
return <StyledTextInput {...rest} />;
|
return <StyledTextInput {...rest} />;
|
||||||
};
|
};
|
||||||
|
@ -68,7 +72,7 @@ const IconInputContainer = styled.div`
|
||||||
width: 100%;
|
width: 100%;
|
||||||
`;
|
`;
|
||||||
|
|
||||||
type TextInputWithIconProps = TextInputProps & {
|
type TextInputWithIconProps = TextInputProps<HTMLInputElement> & {
|
||||||
icon: React.ReactNode;
|
icon: React.ReactNode;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -81,3 +85,27 @@ export const TextInputWithIcon = (props: TextInputWithIconProps) => {
|
||||||
</IconInputContainer>
|
</IconInputContainer>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const StyledTextarea = styled.textarea`
|
||||||
|
${common};
|
||||||
|
${fontCSS};
|
||||||
|
`;
|
||||||
|
|
||||||
|
export const MultilineTextInput = (
|
||||||
|
props: TextInputProps<HTMLTextAreaElement> & { rows?: number }
|
||||||
|
) => {
|
||||||
|
const { ...rest } = props;
|
||||||
|
const [value, setValue] = React.useState(String(props.value));
|
||||||
|
const rows = Math.min(10, Math.max(props.rows || 2, value.split(/\r?\n/).length));
|
||||||
|
return (
|
||||||
|
<StyledTextarea
|
||||||
|
{...rest}
|
||||||
|
rows={rows}
|
||||||
|
value={value}
|
||||||
|
onChange={(eventData) => {
|
||||||
|
setValue(eventData.target.value);
|
||||||
|
props.onChange?.(eventData);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
import { MultilineTextInput } from '@roleypoly/design-system/atoms/text-input';
|
||||||
|
import { EditorShellProps } from '@roleypoly/design-system/organisms/editor-shell';
|
||||||
|
import * as React from 'react';
|
||||||
|
|
||||||
|
export const EditorDetailsTab = (props: EditorShellProps) => {
|
||||||
|
const [serverMessage, updateServerMessage] = React.useState(props.guild.data.message);
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
Server Message
|
||||||
|
<MultilineTextInput
|
||||||
|
value={serverMessage}
|
||||||
|
onChange={(eventData) => updateServerMessage(eventData.target.value)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
|
@ -0,0 +1 @@
|
||||||
|
export * from './EditorDetailsTab';
|
|
@ -1,5 +1,6 @@
|
||||||
import { Tab, TabView } from '@roleypoly/design-system/atoms/tab-view';
|
import { Tab, TabView } from '@roleypoly/design-system/atoms/tab-view';
|
||||||
import { EditorCategoriesTab } from '@roleypoly/design-system/organisms/editor-categories-tab';
|
import { EditorCategoriesTab } from '@roleypoly/design-system/organisms/editor-categories-tab';
|
||||||
|
import { EditorDetailsTab } from '@roleypoly/design-system/organisms/editor-details-tab';
|
||||||
import { PresentableGuild } from '@roleypoly/types';
|
import { PresentableGuild } from '@roleypoly/types';
|
||||||
|
|
||||||
export type EditorShellProps = {
|
export type EditorShellProps = {
|
||||||
|
@ -8,7 +9,7 @@ export type EditorShellProps = {
|
||||||
|
|
||||||
export const EditorShell = (props: EditorShellProps) => (
|
export const EditorShell = (props: EditorShellProps) => (
|
||||||
<TabView initialTab={0}>
|
<TabView initialTab={0}>
|
||||||
<Tab title="Guild Details">{() => <div>hi2!</div>}</Tab>
|
<Tab title="Guild Details">{() => <EditorDetailsTab {...props} />}</Tab>
|
||||||
<Tab title="Categories & Roles">{() => <EditorCategoriesTab {...props} />}</Tab>
|
<Tab title="Categories & Roles">{() => <EditorCategoriesTab {...props} />}</Tab>
|
||||||
<Tab title="Utilities">{() => <div>hi2!</div>}</Tab>
|
<Tab title="Utilities">{() => <div>hi2!</div>}</Tab>
|
||||||
</TabView>
|
</TabView>
|
||||||
|
|
Loading…
Add table
Reference in a new issue