master
well 2025-01-30 16:42:30 +08:00
parent 131db241a3
commit dc1711f949
4 changed files with 16 additions and 22 deletions

View File

@ -1,24 +1,19 @@
'use client'; 'use client';
import { zodResolver } from '@hookform/resolvers/zod';
import { trim } from 'lodash';
import Link from 'next/link';
import { useState } from 'react';
import { useForm } from 'react-hook-form';
import { z } from 'zod';
import { fetchApi } from '@/lib/api'; import { fetchApi } from '@/lib/api';
import { generateLowerString } from '@/lib/utils'; import { generateLowerString } from '@/lib/utils';
import { zodResolver } from '@hookform/resolvers/zod';
import { trim } from 'lodash';
import Link from 'next/link';
import { useState } from 'react';
import { useForm } from 'react-hook-form';
import { z } from 'zod';
import { MarkdownEditor } from '../markdown/editor'; import { MarkdownEditor } from '../markdown/editor';
import { useAlert } from '../test/alert'; import { useAlert } from '../test/alert';
import { Button } from '../ui/button'; import { Button } from '../ui/button';
import { Input } from '../ui/input'; import { Input } from '../ui/input';
import { Label } from '../ui/label'; import { Label } from '../ui/label';
import { isSlugUniqueForFrontend } from './hook'; import { isSlugUniqueForFrontend } from './hook';
export const CreatePostForm = () => { export const CreatePostForm = () => {
@ -218,11 +213,11 @@ export const CreatePostForm = () => {
disabled={form.formState.isSubmitting} disabled={form.formState.isSubmitting}
className=" tw-mt-4 tw-mx-auto " className=" tw-mt-4 tw-mx-auto "
type="submit" type="submit"
onClick={() => handleSubmit()} onClick={async () => handleSubmit()}
> >
</Button> </Button>
<Button onClick={() => isSlugUniqueForFrontend()('y')}>1111</Button> <Button onClick={async () => isSlugUniqueForFrontend()('y')}>1111</Button>
</div> </div>
); );
}; };

View File

@ -1,10 +1,10 @@
'use client'; 'use client';
import type { ToastActionElement, ToastProps } from '@/app/_components/ui/toast';
// Inspired by react-hot-toast library // Inspired by react-hot-toast library
import * as React from 'react'; import * as React from 'react';
import type { ToastActionElement, ToastProps } from '@/app/_components/ui/toast';
const TOAST_LIMIT = 1; const TOAST_LIMIT = 1;
const TOAST_REMOVE_DELAY = 1000000; const TOAST_REMOVE_DELAY = 1000000;
@ -195,4 +195,4 @@ function useToast() {
}; };
} }
export { useToast, toast }; export { toast, useToast };

View File

@ -90,16 +90,16 @@ export function parse(str: string): number {
); );
} }
const match = const match =
/^(?<value>-?(?:\d+)?\.?\d+) *(?<type>milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( /^(?<value>-?(?:\d+(?:\.\d+)?|\.\d+)) *(?<type>milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(
str, str,
); );
// Named capture groups need to be manually typed today. // Named capture groups need to be manually typed today.
// https://github.com/microsoft/TypeScript/issues/32098 // https://github.com/microsoft/TypeScript/issues/32098
const groups = match?.groups as { value: string; type?: string } | undefined; const groups = match?.groups as { value: string; type?: string } | undefined;
if (!groups) { if (!groups) {
return NaN; return Number.NaN;
} }
const n = parseFloat(groups.value); const n = Number.parseFloat(groups.value);
const type = (groups.type || 'ms').toLowerCase() as Lowercase<Unit>; const type = (groups.type || 'ms').toLowerCase() as Lowercase<Unit>;
switch (type) { switch (type) {
case 'years': case 'years':
@ -157,7 +157,6 @@ export function parseStrict(value: StringValue): number {
return parse(value); return parse(value);
} }
// eslint-disable-next-line import/no-default-export
export default msFn; export default msFn;
/** /**
@ -209,7 +208,7 @@ function fmtLong(ms: number): StringValue {
*/ */
export function format(ms: number, options?: Options): string { export function format(ms: number, options?: Options): string {
if (typeof ms !== 'number' || !Number.isFinite(ms)) { if (typeof ms !== 'number' || !Number.isFinite(ms)) {
throw new Error('Value provided to ms.format() must be of type number.'); throw new TypeError('Value provided to ms.format() must be of type number.');
} }
return options?.long ? fmtLong(ms) : fmtShort(ms); return options?.long ? fmtLong(ms) : fmtShort(ms);
} }

View File

@ -6,7 +6,7 @@ const FIELD_VALIDATION = {
SPECIAL_CHAR: (value: string) => /[-._!"`'#%&,:;<>=@{}~$()*+/?[\]^|]+/.test(value), SPECIAL_CHAR: (value: string) => /[-._!"`'#%&,:;<>=@{}~$()*+/?[\]^|]+/.test(value),
LOWERCASE: (value: string) => /[a-z]/.test(value), LOWERCASE: (value: string) => /[a-z]/.test(value),
UPPERCASE: (value: string) => /[A-Z]/.test(value), UPPERCASE: (value: string) => /[A-Z]/.test(value),
NUMBER: (value: string) => /.*[0-9].*/.test(value), NUMBER: (value: string) => /.*\d.*/.test(value),
}, },
MSG: { MSG: {
MIN_LEN: `密码长度必须 ${MIN_LENGTH} 字符以上`, MIN_LEN: `密码长度必须 ${MIN_LENGTH} 字符以上`,