c3956f0f36
- 新增 .gitattributes(CRLF 统一)+ rust-toolchain.toml - 新增 Prettier + ESLint + markdownlint 配置 - 新增 Husky Git hooks(pre-commit lint-staged + commit-msg commitlint) - 新增 vitest 前端测试(12 tests, utils/qrText.ts) - 新增 @ 路径别名(vite + tsconfig) - 新增 ROADMAP / SUPPORT / CODEOWNERS / FUNDING / dependabot - 更新 .gitignore + .editorconfig - 更新 package.json(新增 lint/format/test 脚本) - 全项目 prettier 格式化 + eslint 通过 - 更新 CLAUDE.md + README.md
51 lines
2.0 KiB
TypeScript
51 lines
2.0 KiB
TypeScript
import { useQrState } from '../store/qrContext';
|
|
import { useQrEncode } from '../hooks/useQrEncode';
|
|
import { buildWifiText } from '../utils/qrText';
|
|
|
|
export default function WifiMode() {
|
|
const { state, dispatch } = useQrState();
|
|
const { encode } = useQrEncode();
|
|
|
|
/** checkbox 的 boolean 值统一转为 'true'/'false' 字符串存入 formData */
|
|
const update = (field: string, value: string) => {
|
|
const data = { ...state.formData, [field]: value };
|
|
dispatch({ type: 'SET_FORM_DATA', payload: data });
|
|
encode(buildWifiText(data));
|
|
};
|
|
|
|
return (
|
|
<div className="flex gap-2 items-center h-full px-4">
|
|
<input
|
|
placeholder="SSID"
|
|
value={state.formData.ssid || ''}
|
|
onChange={(e) => update('ssid', e.target.value)}
|
|
className="flex-1 px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-sm bg-transparent outline-none focus:ring-2 focus:ring-blue-500/30"
|
|
/>
|
|
<input
|
|
placeholder="密码"
|
|
type="password"
|
|
value={state.formData.password || ''}
|
|
onChange={(e) => update('password', e.target.value)}
|
|
className="flex-1 px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-sm bg-transparent outline-none focus:ring-2 focus:ring-blue-500/30"
|
|
/>
|
|
<select
|
|
value={state.formData.encryption || 'WPA'}
|
|
onChange={(e) => update('encryption', e.target.value)}
|
|
className="px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-sm bg-transparent outline-none focus:ring-2 focus:ring-blue-500/30"
|
|
>
|
|
<option value="WPA">WPA/WPA2</option>
|
|
<option value="WEP">WEP</option>
|
|
<option value="nopass">无密码</option>
|
|
</select>
|
|
<label className="flex items-center gap-1 text-sm text-gray-500 dark:text-gray-400 whitespace-nowrap">
|
|
<input
|
|
type="checkbox"
|
|
checked={state.formData.hidden === 'true'}
|
|
onChange={(e) => update('hidden', e.target.checked ? 'true' : 'false')}
|
|
/>
|
|
隐藏
|
|
</label>
|
|
</div>
|
|
);
|
|
}
|