项目文件夹

文件
wehub-resource-sync 2114b14ee0
Sync main into demo / sync (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:35:26 +08:00

81 行
2.5 KiB
TypeScript

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
import React from 'react';
import { CalcButton } from './CalcButton';
import { useCalculator2Store } from '../state';
import { useCalculator2Gestures } from '../hooks/useCalculator2Gestures';
import { colors } from '../res/colors';
import { strings } from '../res/strings';
/**
* 运算符键盘 — 1列5行
* 翻译自 AOSP pad_operator_one_col.xml
*
* del/clr
* ÷
* ×
*
* +
*/
interface OperatorPadProps {
style?: React.CSSProperties;
}
export const OperatorPad: React.FC<OperatorPadProps> = ({ style }) => {
const state = useCalculator2Store(s => s.state);
const inputOperator = useCalculator2Store(s => s.inputOperator);
const onDelete = useCalculator2Store(s => s.onDelete);
const onClear = useCalculator2Store(s => s.onClear);
const { bindAction } = useCalculator2Gestures();
// del/clr 切换:INPUT 态 → del; RESULT/ERROR 态 → clr
const isDelMode = state === 'INPUT' || state === 'EVALUATE';
const operators = [
{ label: strings.op_div, op: '/', actionId: 'op.div' },
{ label: strings.op_mul, op: '*', actionId: 'op.mul' },
{ label: strings.op_sub, op: '-', actionId: 'op.sub' },
{ label: strings.op_add, op: '+', actionId: 'op.add' },
];
return (
<div
style={{
backgroundColor: colors.pad_operator_background,
display: 'flex',
flexDirection: 'column',
paddingTop: 'var(--app-pad-operator-padding-top)',
paddingBottom: 'var(--app-pad-operator-padding-bottom)',
paddingLeft: 'var(--app-pad-operator-padding-start)',
paddingRight: 'var(--app-pad-operator-padding-end)',
...style,
}}
>
{/* del / clr */}
<CalcButton
label={isDelMode ? strings.del : strings.clr}
fontSize="var(--app-operator-text-button)"
textColor="var(--app-on-surface)"
rippleColor={colors.ripple}
uppercase
className="flex-1"
onTrigger={isDelMode ? onDelete : onClear}
onLongPress={isDelMode ? onClear : undefined}
{...bindAction(isDelMode ? 'delete' : 'clear')}
/>
{/* ÷ × + */}
{operators.map(({ label, op, actionId }) => (
<CalcButton
key={op}
label={label}
fontSize="var(--app-operator-button-text)"
textColor="var(--app-on-surface)"
rippleColor={colors.ripple}
className="flex-1"
onTrigger={() => inputOperator(op)}
{...bindAction(actionId)}
/>
))}
</div>
);
};