Timer
Feedback & Status
시간을 표시하는 타이머.
Usage
import
API Reference
예제
Usage
인증 만료, 재전송 대기, 제한 시간처럼 지정된 만료 시각까지 남은 시간을 표시할 때 사용한다.
import
import
import { Timer } from '@mildang/design-system/Timer';예제를 복사해 쓸 때 필요한 준비
• @mildang/styled-system 은 이 저장소에서 Panda 가 생성하는 산출물이다. 저장소 안에서는 turbo run ship 이후 쓸 수 있고, 패키지 소비자는 자기 Panda 산출물이나 다른 레이아웃 수단으로 바꿔야 한다.
API Reference
Timer Props
Prop
Type
Default
targetTimeStamp
필수
Date
지정 안 함
autoStart
boolean
true
format
string
mm:ss
onOver
() => void
지정 안 함
예제
기본 사용
남은 5분을 mm:ss 로 세는 카운트다운입니다. 문서 카드에서는 autoStart 를 꺼 정지 화면으로 둡니다.
import type { ComponentProps } from 'react';
import { Timer } from '@mildang/design-system/Timer';
const STORY_DEFAULT_ARGS = { ...({}), ...({
targetTimeStamp: new Date(Date.now() + 5 * 60 * 1000),
}) } as ComponentProps<typeof Timer>;
const TimerDemoExampleRender = (args: ComponentProps<typeof Timer>) => {
return <Timer targetTimeStamp={new Date(args.targetTimeStamp)} />;
};
export default function TimerDemoExample(props: Partial<ComponentProps<typeof Timer>>) {
const mergedProps = { ...STORY_DEFAULT_ARGS, ...props } as ComponentProps<typeof Timer>;
return TimerDemoExampleRender(mergedProps);
}
명령형 제어
ref 로 pause·resume·restart 를 직접 부릅니다. 시험 타이머처럼 외부 버튼이 흐름을 끊어야 할 때 씁니다.
import type { ComponentProps } from 'react';
import { Timer } from '@mildang/design-system/Timer';
import { Flex } from '@mildang/styled-system/jsx';
import { Chip } from '@mildang/design-system/Chip';
const STORY_DEFAULT_ARGS = { ...({}), ...({
targetTimeStamp: new Date(Date.now() + 120 * 60 * 1000),
autoStart: true,
}) } as ComponentProps<typeof Timer>;
const TimerCustomFormatExampleRender = (args: ComponentProps<typeof Timer>) => {
return (
<Flex direction="row" align="start" gap={32}>
<Flex direction="column" align="center" gap={8} justify="space-between">
<Chip label="format: 'hh:mm:ss'" />
<Timer targetTimeStamp={new Date(args.targetTimeStamp)} format="hh:mm:ss" />
</Flex>
<Flex direction="column" align="center" gap={8}>
<Chip label="format: 'mm:ss'" />
<Timer targetTimeStamp={new Date(args.targetTimeStamp)} format="mm:ss" />
</Flex>
<Flex direction="column" align="center" gap={8}>
<Chip label="format: 'ss'" />
<Timer targetTimeStamp={new Date(args.targetTimeStamp)} format="ss" />
</Flex>
</Flex>
);
};
export default function TimerCustomFormatExample(props: Partial<ComponentProps<typeof Timer>>) {
const mergedProps = { ...STORY_DEFAULT_ARGS, ...props } as ComponentProps<typeof Timer>;
return TimerCustomFormatExampleRender(mergedProps);
}
AutoStart
import type { ComponentProps } from 'react';
import { Timer } from '@mildang/design-system/Timer';
import { Flex } from '@mildang/styled-system/jsx';
import { Chip } from '@mildang/design-system/Chip';
import { default as Text } from '@mildang/design-system/Text';
const STORY_DEFAULT_ARGS = { ...({}), ...({
targetTimeStamp: new Date(Date.now() + 5 * 60 * 1000),
onOver: () => alert('Timer over'),
format: 'hh:mm:ss',
}) } as ComponentProps<typeof Timer>;
const TimerAutoStartExampleRender = (args: ComponentProps<typeof Timer>) => {
return (
<Flex direction="row" align="start" gap={32}>
<Flex direction="column" align="center" gap={8} justify="space-between">
<Chip label="AutoStart: false" />
<Text>
<Timer targetTimeStamp={new Date(args.targetTimeStamp)} autoStart={false} />
</Text>
</Flex>
<Flex direction="column" align="center" gap={8}>
<Chip label="AutoStart: true" />
<Text>
<Timer targetTimeStamp={new Date(args.targetTimeStamp)} autoStart={true} />
</Text>
</Flex>
</Flex>
);
};
export default function TimerAutoStartExample(props: Partial<ComponentProps<typeof Timer>>) {
const mergedProps = { ...STORY_DEFAULT_ARGS, ...props } as ComponentProps<typeof Timer>;
return TimerAutoStartExampleRender(mergedProps);
}
PauseTimer
import type { ComponentProps } from 'react';
import { Timer, TimerHandle } from '@mildang/design-system/Timer';
import { useRef, useState } from 'react';
import { Flex } from '@mildang/styled-system/jsx';
import { Button } from '@mildang/design-system/Button';
const STORY_DEFAULT_ARGS = { ...({}), ...({
targetTimeStamp: new Date(Date.now() + 5 * 60 * 1000),
onOver: () => alert('Timer over'),
format: 'hh:mm:ss',
autoStart: true,
}) } as ComponentProps<typeof Timer>;
const TimerPauseTimerExampleRender = (args: ComponentProps<typeof Timer>) => {
const timerRef = useRef<TimerHandle>(null);
const [isPause, setIsPause] = useState(false);
return (
<Flex direction="column" align="start" gap={8}>
<Timer {...args} targetTimeStamp={new Date(args.targetTimeStamp)} ref={timerRef} />
<Flex direction="row" align="center" gap={16}>
<Button
variant="primary"
onClick={() => {
if (isPause) {
timerRef.current?.resume();
setIsPause(false);
} else {
timerRef.current?.pause();
setIsPause(true);
}
}}
>
{isPause ? '재생' : '일시정지'}
</Button>
</Flex>
</Flex>
);
};
export default function TimerPauseTimerExample(props: Partial<ComponentProps<typeof Timer>>) {
const mergedProps = { ...STORY_DEFAULT_ARGS, ...props } as ComponentProps<typeof Timer>;
return TimerPauseTimerExampleRender(mergedProps);
}