@meta-1/design 0.0.188 → 0.0.190

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meta-1/design",
3
- "version": "0.0.188",
3
+ "version": "0.0.190",
4
4
  "keywords": [
5
5
  "easykit",
6
6
  "design",
@@ -40,6 +40,7 @@
40
40
  "@radix-ui/react-scroll-area": "1.2.1",
41
41
  "@radix-ui/react-select": "2.1.2",
42
42
  "@radix-ui/react-separator": "1.1.0",
43
+ "@radix-ui/react-slider": "^1.3.6",
43
44
  "@radix-ui/react-slot": "1.1.0",
44
45
  "@radix-ui/react-switch": "1.1.1",
45
46
  "@radix-ui/react-tabs": "1.1.1",
@@ -0,0 +1,26 @@
1
+ import * as React from "react"
2
+ import * as SliderPrimitive from "@radix-ui/react-slider"
3
+
4
+ import { cn } from "@meta-1/design/lib/utils"
5
+
6
+ const Slider = React.forwardRef<
7
+ React.ElementRef<typeof SliderPrimitive.Root>,
8
+ React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>
9
+ >(({ className, ...props }, ref) => (
10
+ <SliderPrimitive.Root
11
+ ref={ref}
12
+ className={cn(
13
+ "relative flex w-full touch-none select-none items-center",
14
+ className
15
+ )}
16
+ {...props}
17
+ >
18
+ <SliderPrimitive.Track className="relative h-2 w-full grow overflow-hidden rounded-full bg-secondary">
19
+ <SliderPrimitive.Range className="absolute h-full bg-primary" />
20
+ </SliderPrimitive.Track>
21
+ <SliderPrimitive.Thumb className="block h-5 w-5 rounded-full border-2 border-primary bg-background ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50" />
22
+ </SliderPrimitive.Root>
23
+ ))
24
+ Slider.displayName = SliderPrimitive.Root.displayName
25
+
26
+ export { Slider }
@@ -24,6 +24,7 @@ export type UploaderProps = PropsWithChildren<{
24
24
  data?: unknown;
25
25
  showButton?: boolean;
26
26
  uploadHandle?: (props: HandleProps) => void;
27
+ autoUpload?: boolean;
27
28
  }> &
28
29
  DropzoneOptions;
29
30
 
@@ -47,6 +48,7 @@ export const Uploader = forwardRef<HTMLDivElement, UploaderProps>((props, forwar
47
48
  children,
48
49
  uploadHandle = defaultUploadHandle,
49
50
  maxFiles,
51
+ autoUpload = false,
50
52
  ...rest
51
53
  } = props;
52
54
  const elementRef = forwardedRef;
@@ -75,6 +77,42 @@ export const Uploader = forwardRef<HTMLDivElement, UploaderProps>((props, forwar
75
77
  filesRef.current = files;
76
78
  }, [files]);
77
79
 
80
+ const onUpload = useCallback(() => {
81
+ const updateFile = (file: UploadFile, status: "uploading" | "done" | "error") => {
82
+ const idx = filesRef.current.findIndex((f) => (f as UploadFile).uid === file.uid);
83
+ if (idx !== -1) {
84
+ file.status = status;
85
+ filesRef.current[idx] = {
86
+ ...filesRef.current[idx],
87
+ ...file,
88
+ name: filesRef.current[idx].name,
89
+ size: filesRef.current[idx].size,
90
+ type: filesRef.current[idx].type,
91
+ };
92
+ setFiles([...filesRef.current]);
93
+ onChange?.([...filesRef.current] as UploadFile[]);
94
+ }
95
+ };
96
+ for (const f of filesRef.current) {
97
+ const file = f as UploadFile;
98
+ if (file.status === "init") {
99
+ file.status = "uploading";
100
+ file.progress = 0;
101
+ uploadHandle({
102
+ file,
103
+ action,
104
+ headers,
105
+ data,
106
+ onProgress: (file) => updateFile(file, "uploading"),
107
+ onSuccess: (file) => updateFile(file, "done"),
108
+ onError: (file) => updateFile(file, "error"),
109
+ });
110
+ }
111
+ }
112
+ setFiles([...filesRef.current]);
113
+ onChange?.([...filesRef.current] as UploadFile[]);
114
+ }, [action, headers, data, uploadHandle, onChange]);
115
+
78
116
  const { getRootProps, getInputProps } = useDropzone({
79
117
  ...rest,
80
118
  maxFiles,
@@ -112,8 +150,18 @@ export const Uploader = forwardRef<HTMLDivElement, UploaderProps>((props, forwar
112
150
  return uploadFile;
113
151
  }),
114
152
  ];
153
+
154
+ // 立即更新 filesRef,确保 onUpload 能获取到最新文件列表
155
+ filesRef.current = newFiles;
115
156
  setFiles(newFiles);
116
157
  onChange?.(newFiles as UploadFile[]);
158
+
159
+ if (autoUpload) {
160
+ // 如果启用自动上传,延迟执行上传
161
+ setTimeout(() => {
162
+ onUpload();
163
+ }, 0);
164
+ }
117
165
  },
118
166
  onDropRejected(fileRejections) {
119
167
  // 收集所有文件名和错误信息
@@ -124,42 +172,6 @@ export const Uploader = forwardRef<HTMLDivElement, UploaderProps>((props, forwar
124
172
  },
125
173
  });
126
174
 
127
- const onUpload = useCallback(() => {
128
- const updateFile = (file: UploadFile, status: "uploading" | "done" | "error") => {
129
- const idx = filesRef.current.findIndex((f) => (f as UploadFile).uid === file.uid);
130
- if (idx !== -1) {
131
- file.status = status;
132
- filesRef.current[idx] = {
133
- ...filesRef.current[idx],
134
- ...file,
135
- name: filesRef.current[idx].name,
136
- size: filesRef.current[idx].size,
137
- type: filesRef.current[idx].type,
138
- };
139
- setFiles([...filesRef.current]);
140
- onChange?.([...filesRef.current] as UploadFile[]);
141
- }
142
- };
143
- for (const f of filesRef.current) {
144
- const file = f as UploadFile;
145
- if (file.status === "init") {
146
- file.status = "uploading";
147
- file.progress = 0;
148
- uploadHandle({
149
- file,
150
- action,
151
- headers,
152
- data,
153
- onProgress: (file) => updateFile(file, "uploading"),
154
- onSuccess: (file) => updateFile(file, "done"),
155
- onError: (file) => updateFile(file, "error"),
156
- });
157
- }
158
- }
159
- setFiles([...filesRef.current]);
160
- onChange?.([...filesRef.current] as UploadFile[]);
161
- }, [action, headers, data, uploadHandle, onChange]);
162
-
163
175
  const renderFile = (file: UploadFile) => {
164
176
  return (
165
177
  <div className={cn("flex items-center justify-center border-b", "last:border-none")} key={file.uid}>
package/src/index.ts CHANGED
@@ -80,6 +80,7 @@ export {
80
80
  SheetTrigger,
81
81
  } from "./components/ui/sheet";
82
82
  export { Skeleton } from "./components/ui/skeleton";
83
+ export { Slider } from "./components/ui/slider";
83
84
  // base
84
85
  export { Toaster } from "./components/ui/sonner";
85
86
  export {