Skip to content

Commit

Permalink
feat(Divider): refactor (#403)
Browse files Browse the repository at this point in the history
* feat(DIvider): refactor

* chore: update common

* chore: rename tsx

* chore(site): update mobile.config

* chore(husky): ci环境不运行

* chore: update snapshot

* chore(site): 展示tsx 示例代码

* feat: children?: React.ReactNode

* docs: sync api

* feat: remove children api

* docs: update

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Y. <anly_yaw@163.com>
  • Loading branch information
3 people authored Jul 30, 2024
1 parent f2a0b0a commit 1438ed7
Show file tree
Hide file tree
Showing 20 changed files with 999 additions and 143 deletions.
1 change: 1 addition & 0 deletions .husky/commit-msg
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/bin/sh
[ -n "$CI" ] && exit 0
. "$(dirname "$0")/_/husky.sh"

npx commitlint -e $HUSKY_GIT_PARAMS
Expand Down
1 change: 1 addition & 0 deletions .husky/pre-commit
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/bin/sh
[ -n "$CI" ] && exit 0
. "$(dirname "$0")/_/husky.sh"

npm run lint:fix
2 changes: 1 addition & 1 deletion site/mobile/mobile.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ export default {
{
title: 'Divider 分割符',
name: 'divider',
component: () => import('tdesign-mobile-react/divider/_example/index.jsx'),
component: () => import('tdesign-mobile-react/divider/_example/index.tsx'),
},
{
title: 'Icon 图标',
Expand Down
7 changes: 6 additions & 1 deletion site/plugin-tdoc/transforms.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,14 @@ export default {

// 替换成对应 demo 文件
source = source.replace(/\{\{\s+(.+)\s+\}\}/g, (demoStr, demoFileName) => {
const tsDemoPath = path.resolve(resourceDir, `./_example/${demoFileName}.tsx`);
if (fs.existsSync(tsDemoPath)) {
return `\n::: demo _example/${demoFileName} ${name}\n:::\n`;
}

const demoPath = path.resolve(resourceDir, `./_example/${demoFileName}.jsx`);
if (!fs.existsSync(demoPath)) {
console.log('\x1B[36m%s\x1B[0m', `${name} 组件需要实现 _example/${demoFileName}.jsx 示例!`);
console.log('\x1B[36m%s\x1B[0m', `${name} 组件需要实现 _example/${demoFileName}.tsx 示例!`);
return '\n<h3>DEMO (🚧建设中)...</h3>';
}

Expand Down
46 changes: 22 additions & 24 deletions src/divider/Divider.tsx
Original file line number Diff line number Diff line change
@@ -1,40 +1,38 @@
import React, { FC } from 'react';
import React from 'react';
import type { FC } from 'react';
import classNames from 'classnames';
import { TdDividerProps } from './type';
import { dividerDefaultProps } from './defaultProps';
import { StyledProps } from '../common';
import useConfig from '../_util/useConfig';
import withNativeProps, { NativeProps } from '../_util/withNativeProps';
import useDefaultProps from '../hooks/useDefaultProps';

export interface DividerProps extends TdDividerProps, NativeProps {}

const defaultProps = {
align: 'center',
dashed: false,
layout: 'horizontal',
lineColor: '',
};
export interface DividerProps extends TdDividerProps, StyledProps {
children?: React.ReactNode;
}

const Divider: FC<DividerProps> = (props) => {
const { children, align, dashed, layout, lineColor, content } = props;
const { children, align, dashed, layout, content, style } = useDefaultProps<DividerProps>(props, dividerDefaultProps);
const { classPrefix } = useConfig();
const name = `${classPrefix}-divider`;
const dividerClass = `${classPrefix}-divider`;
const contentNode = content || children;

const classes = classNames(name, {
[`${name}-${layout}`]: layout,
[`${name}--hairline`]: true,
[`${name}--content-${align}`]: align && contentNode,
[`${name}--dashed`]: dashed,
});
const classes = classNames([
dividerClass,
`${dividerClass}--${layout}`,
`${dividerClass}--${align}`,
{
[`${dividerClass}--dashed`]: dashed,
},
]);

return withNativeProps(
props,
<div className={classes} style={lineColor ? { borderColor: lineColor } : undefined}>
{contentNode && <span className={`${name}__content`}>{contentNode}</span>}
</div>,
return (
<div className={classes} style={style} role="separator">
<div className={`${dividerClass}__content`}>{contentNode}</div>
</div>
);
};

Divider.defaultProps = defaultProps as DividerProps;
Divider.displayName = 'Divider';

export default Divider;
66 changes: 66 additions & 0 deletions src/divider/__tests__/divider.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import React from 'react';
import { describe, expect, it, render, waitFor } from '@test/utils';
import Divider from '../Divider';
import { TdDividerProps } from '../type';

describe('Divider', () => {
describe('props', () => {
it(':align', async () => {
const testId = 'divider test align';
const aligns: TdDividerProps['align'][] = ['left', 'right', 'center'];
const { getByTestId } = render(
<div data-testid={testId}>
{aligns?.map((align, index) => (
<Divider key={index} align={align} />
))}
</div>,
);

const instance = await waitFor(() => getByTestId(testId));

for (let index = 0; index < aligns.length; index++) {
const align = aligns[index];
expect(() => instance.querySelector(`.t-divider--${align}`)).toBeTruthy();
}
});

it(':layout', async () => {
const testId = 'divider test layout';
const layouts: TdDividerProps['layout'][] = ['horizontal', 'vertical'];
const { getByTestId } = render(
<div data-testid={testId}>
{layouts?.map((layout, index) => (
<Divider key={index} layout={layout} />
))}
</div>,
);

const instance = await waitFor(() => getByTestId(testId));

for (let index = 0; index < layouts.length; index++) {
const layout = layouts[index];
expect(() => instance.querySelector(`.t-divider--${layout}`)).toBeTruthy();
}
});

it(':dashed', async () => {
const { container } = render(<Divider dashed />);
const dividerElement = container.firstChild;
expect(dividerElement).toHaveClass('t-divider--dashed');
});

it(':content', async () => {
const content = 'DividerContent';
const { getByText } = render(<Divider content={content}></Divider>);
expect(getByText(content).textContent).toBeTruthy();
});
});

describe('slot', () => {
it(':children', async () => {
const content = 'DividerContent';
const { getByText } = render(<Divider>{content}</Divider>);
expect(getByText(content).textContent).toBeTruthy();
});
});
});
21 changes: 0 additions & 21 deletions src/divider/_example/align.jsx

This file was deleted.

30 changes: 0 additions & 30 deletions src/divider/_example/base.jsx

This file was deleted.

29 changes: 29 additions & 0 deletions src/divider/_example/base.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import React from 'react';
import { Divider } from 'tdesign-mobile-react';

import './style/index.less';

export default function Base() {
return (
<>
<div className="divider-demo__title">水平分割线</div>
<Divider />

<div className="divider-demo__title">带文字水平分割线</div>
<Divider content="文字信息" align="left" />
<Divider content="文字信息" />
<Divider content="文字信息" align="right" />

<div className="divider-demo__title" style={{ marginBottom: '10px' }}>
垂直分割线
</div>
<div className="divider-wrapper">
<span>文字信息</span>
<Divider layout="vertical" />
<span>文字信息</span>
<Divider layout="vertical" />
<span>文字信息</span>
</div>
</>
);
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
import React from 'react';
import TDemoBlock from '../../../site/mobile/components/DemoBlock';
import TDemoHeader from '../../../site/mobile/components/DemoHeader';
import Vertical from './vertical';
import BaseDemo from './base';
import AlignDemo from './align';
import ThemeDemo from './theme';

import './style/index.less';

export default function Base() {
export default function DividerDemo() {
return (
<div className="tdesign-mobile-demo">
<TDemoHeader title="Divider 分割符" summary="用于分割、组织、细化有一定逻辑的组织元素内容和页面结构。" />
<TDemoBlock title="01 类型" summary="分割符主要是由直线和文字组成">
<TDemoBlock title="01 组件类型" padding={true}>
<BaseDemo />
<AlignDemo />
<Vertical />
</TDemoBlock>
<TDemoBlock title="02 组件状态" padding={true}>
<ThemeDemo />
</TDemoBlock>
</div>
);
Expand Down
37 changes: 10 additions & 27 deletions src/divider/_example/style/index.less
Original file line number Diff line number Diff line change
@@ -1,34 +1,17 @@
.tdesign-mobile-demo {
background-color: #fff;
padding-bottom: 16px;

.divider-demo-container {
h3 {
font-size: 12px;
font-weight: 400;
font-family: 'PingFang SC';
color: #a9a9a9;
padding: 16px;
}
}
}

.t-demo1 {
margin: 0 16px;
}

.t-demo2 {
margin-left: 16px;
.divider-demo__title {
font-size: 14px;
color: var(--td-text-color-secondary, rgba(0, 0, 0, 0.6));
padding: 8px 16px;
line-height: 20px;
}

.t-demo3 {
margin-left: 76px;
}

.vertical-panel {
.divider-wrapper {
display: flex;
height: 20px;
margin: 0 16px;
font-size: 12px;
color: rgba(0, 0, 0, 0.4);
align-items: center;
font-size: 14px;
color: var(--td-text-color-primary, rgba(0, 0, 0, 0.9));
padding-left: 16px;
}
15 changes: 15 additions & 0 deletions src/divider/_example/theme.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import React from 'react';
import { Divider } from 'tdesign-mobile-react';
import './style/index.less';

export default function Theme() {
return (
<div>
<div className="divider-demo__title">虚线样式</div>
<Divider dashed />
<Divider dashed content="文字信息" align="left" />
<Divider dashed content="文字信息" />
<Divider dashed content="文字信息" align="right" />
</div>
);
}
25 changes: 0 additions & 25 deletions src/divider/_example/vertical.jsx

This file was deleted.

7 changes: 7 additions & 0 deletions src/divider/defaultProps.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
/**
* 该文件为脚本自动生成文件,请勿随意修改。如需修改请联系 PMC
* */

import { TdDividerProps } from './type';

export const dividerDefaultProps: TdDividerProps = { align: 'center', dashed: false, layout: 'horizontal' };
15 changes: 15 additions & 0 deletions src/divider/divider.en-US.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
:: BASE_DOC ::

## API

### Divider Props

name | type | default | description | required
-- | -- | -- | -- | --
className | String | - | className of component | N
style | Object | - | CSS(Cascading Style Sheets),Typescript:`React.CSSProperties` | N
align | String | center | options: left/right/center | N
children | TNode | - | Typescript:`string \| TNode`[see more ts definition](https://github.com/Tencent/tdesign-mobile-react/blob/develop/src/common.ts) | N
content | TNode | - | Typescript:`string \| TNode`[see more ts definition](https://github.com/Tencent/tdesign-mobile-react/blob/develop/src/common.ts) | N
dashed | Boolean | false | \- | N
layout | String | horizontal | options: horizontal/vertical | N
Loading

0 comments on commit 1438ed7

Please sign in to comment.