@unif/react-native-design 0.6.0 → 0.7.0

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.
Files changed (31) hide show
  1. package/lib/module/components/ui/Confirm/ConfirmHost.js +85 -0
  2. package/lib/module/components/ui/Confirm/ConfirmHost.js.map +1 -0
  3. package/lib/module/components/ui/Confirm/confirm.js +51 -0
  4. package/lib/module/components/ui/Confirm/confirm.js.map +1 -0
  5. package/lib/module/components/ui/Confirm/index.js +5 -0
  6. package/lib/module/components/ui/Confirm/index.js.map +1 -0
  7. package/lib/module/components/ui/Confirm/styles.js +41 -0
  8. package/lib/module/components/ui/Confirm/styles.js.map +1 -0
  9. package/lib/module/components/ui/Confirm/types.js +2 -0
  10. package/lib/module/components/ui/Confirm/types.js.map +1 -0
  11. package/lib/module/components/ui/index.js +1 -0
  12. package/lib/module/components/ui/index.js.map +1 -1
  13. package/lib/typescript/src/components/ui/Confirm/ConfirmHost.d.ts +10 -0
  14. package/lib/typescript/src/components/ui/Confirm/ConfirmHost.d.ts.map +1 -0
  15. package/lib/typescript/src/components/ui/Confirm/confirm.d.ts +20 -0
  16. package/lib/typescript/src/components/ui/Confirm/confirm.d.ts.map +1 -0
  17. package/lib/typescript/src/components/ui/Confirm/index.d.ts +4 -0
  18. package/lib/typescript/src/components/ui/Confirm/index.d.ts.map +1 -0
  19. package/lib/typescript/src/components/ui/Confirm/styles.d.ts +38 -0
  20. package/lib/typescript/src/components/ui/Confirm/styles.d.ts.map +1 -0
  21. package/lib/typescript/src/components/ui/Confirm/types.d.ts +21 -0
  22. package/lib/typescript/src/components/ui/Confirm/types.d.ts.map +1 -0
  23. package/lib/typescript/src/components/ui/index.d.ts +2 -0
  24. package/lib/typescript/src/components/ui/index.d.ts.map +1 -1
  25. package/package.json +1 -1
  26. package/src/components/ui/Confirm/ConfirmHost.tsx +91 -0
  27. package/src/components/ui/Confirm/confirm.ts +53 -0
  28. package/src/components/ui/Confirm/index.ts +3 -0
  29. package/src/components/ui/Confirm/styles.ts +41 -0
  30. package/src/components/ui/Confirm/types.ts +22 -0
  31. package/src/components/ui/index.ts +2 -0
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+
3
+ import React, { useCallback, useEffect, useState } from 'react';
4
+ import { Modal, Pressable, Text, View } from 'react-native';
5
+ import { useSafeAreaInsets } from 'react-native-safe-area-context';
6
+ import { space, useThemedStyles } from "../../../theme/index.js";
7
+ import { Button } from "../Button/index.js";
8
+ import { _subs } from "./confirm.js";
9
+ import { makeStyles } from "./styles.js";
10
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
11
+ /**
12
+ * Confirm 对话框宿主 —— App 根挂一次,监听 `confirm()` 调用并渲染。
13
+ *
14
+ * 原生 RN `Modal`(transparent + animationType slide)从底部滑入,backdrop 点击
15
+ * 取消、内层 sheet 拦截点击不冒泡。**不依赖 @gorhom**(0.6.0 去 @gorhom 后改为
16
+ * 纯 RN Modal + pub/sub 实现)。
17
+ */
18
+ export function ConfirmHost() {
19
+ const styles = useThemedStyles(makeStyles);
20
+ const insets = useSafeAreaInsets();
21
+ const [entry, setEntry] = useState(null);
22
+ useEffect(() => {
23
+ const sub = next => setEntry(next);
24
+ _subs.add(sub);
25
+ return () => {
26
+ _subs.delete(sub);
27
+ };
28
+ }, []);
29
+ const handleConfirm = useCallback(() => {
30
+ entry?.resolve(true);
31
+ setEntry(null);
32
+ }, [entry]);
33
+ const handleCancel = useCallback(() => {
34
+ entry?.resolve(false);
35
+ setEntry(null);
36
+ }, [entry]);
37
+ return /*#__PURE__*/_jsx(Modal, {
38
+ visible: !!entry,
39
+ transparent: true,
40
+ animationType: "slide",
41
+ statusBarTranslucent: true,
42
+ onRequestClose: handleCancel,
43
+ children: /*#__PURE__*/_jsx(Pressable, {
44
+ style: styles.backdrop,
45
+ onPress: handleCancel,
46
+ accessibilityRole: "button",
47
+ accessibilityLabel: "\u5173\u95ED",
48
+ children: /*#__PURE__*/_jsx(Pressable, {
49
+ style: [styles.sheet, {
50
+ paddingBottom: insets.bottom + space['7']
51
+ }],
52
+ onPress: () => {},
53
+ children: entry ? /*#__PURE__*/_jsxs(_Fragment, {
54
+ children: [/*#__PURE__*/_jsxs(View, {
55
+ style: styles.body,
56
+ children: [/*#__PURE__*/_jsx(Text, {
57
+ style: styles.title,
58
+ accessibilityRole: "header",
59
+ children: entry.title
60
+ }), entry.message ? /*#__PURE__*/_jsx(Text, {
61
+ style: styles.message,
62
+ children: entry.message
63
+ }) : null]
64
+ }), /*#__PURE__*/_jsxs(View, {
65
+ style: styles.actions,
66
+ children: [/*#__PURE__*/_jsx(Button, {
67
+ testID: "confirm-cancel",
68
+ label: entry.cancelLabel ?? '取消',
69
+ variant: "secondary",
70
+ block: true,
71
+ onPress: handleCancel
72
+ }), /*#__PURE__*/_jsx(Button, {
73
+ testID: "confirm-ok",
74
+ label: entry.confirmLabel ?? '确认',
75
+ variant: entry.destructive ? 'danger' : 'primary',
76
+ block: true,
77
+ onPress: handleConfirm
78
+ })]
79
+ })]
80
+ }) : null
81
+ })
82
+ })
83
+ });
84
+ }
85
+ //# sourceMappingURL=ConfirmHost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useCallback","useEffect","useState","Modal","Pressable","Text","View","useSafeAreaInsets","space","useThemedStyles","Button","_subs","makeStyles","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","ConfirmHost","styles","insets","entry","setEntry","sub","next","add","delete","handleConfirm","resolve","handleCancel","visible","transparent","animationType","statusBarTranslucent","onRequestClose","children","style","backdrop","onPress","accessibilityRole","accessibilityLabel","sheet","paddingBottom","bottom","body","title","message","actions","testID","label","cancelLabel","variant","block","confirmLabel","destructive"],"sourceRoot":"../../../../../src","sources":["components/ui/Confirm/ConfirmHost.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * 命令式 `confirm()` API —— 跟 `<ConfirmHost />` 配对使用。
5
+ *
6
+ * 业务任意位置 `const ok = await confirm({title, message, ...})`,
7
+ * 不用维护 useState / open / onClose。
8
+ *
9
+ * 同一时间只允许 1 个 confirm 活跃;若已有正在显示,新请求立即 resolve(false) 并 warn。
10
+ */
11
+ import { createLogger } from "../../../utils/logger/index.js";
12
+ const log = createLogger('confirm');
13
+ let _id = 0;
14
+ let _activeEntry = null;
15
+ export const _subs = new Set();
16
+
17
+ /**
18
+ * 弹出确认对话框,返回 Promise<boolean>。
19
+ * - 用户点确认 → resolve(true)
20
+ * - 用户点取消 / 点 backdrop / 拖关闭 → resolve(false)
21
+ *
22
+ * 示例:
23
+ * ```ts
24
+ * const ok = await confirm({
25
+ * title: '确认注销账号?',
26
+ * message: '注销后所有数据删除,无法恢复',
27
+ * confirmLabel: '确认注销',
28
+ * destructive: true,
29
+ * });
30
+ * if (ok) doLogout();
31
+ * ```
32
+ */
33
+ export function confirm(options) {
34
+ if (_activeEntry) {
35
+ log.warn('confirm() 已有一个对话框在显示,新请求被拒绝(同一时间只 1 个,避免叠加)。');
36
+ return Promise.resolve(false);
37
+ }
38
+ return new Promise(resolve => {
39
+ const entry = {
40
+ id: ++_id,
41
+ ...options,
42
+ resolve: confirmed => {
43
+ _activeEntry = null;
44
+ resolve(confirmed);
45
+ }
46
+ };
47
+ _activeEntry = entry;
48
+ _subs.forEach(s => s(entry));
49
+ });
50
+ }
51
+ //# sourceMappingURL=confirm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createLogger","log","_id","_activeEntry","_subs","Set","confirm","options","warn","Promise","resolve","entry","id","confirmed","forEach","s"],"sourceRoot":"../../../../../src","sources":["components/ui/Confirm/confirm.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,YAAY,QAAQ,gCAAuB;AAGpD,MAAMC,GAAG,GAAGD,YAAY,CAAC,SAAS,CAAC;AAEnC,IAAIE,GAAG,GAAG,CAAC;AACX,IAAIC,YAAiC,GAAG,IAAI;AAC5C,OAAO,MAAMC,KAAK,GAAG,IAAIC,GAAG,CAAa,CAAC;;AAE1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,OAAOA,CAACC,OAAuB,EAAoB;EACjE,IAAIJ,YAAY,EAAE;IAChBF,GAAG,CAACO,IAAI,CACN,8CACF,CAAC;IACD,OAAOC,OAAO,CAACC,OAAO,CAAC,KAAK,CAAC;EAC/B;EACA,OAAO,IAAID,OAAO,CAAWC,OAAO,IAAK;IACvC,MAAMC,KAAmB,GAAG;MAC1BC,EAAE,EAAE,EAAEV,GAAG;MACT,GAAGK,OAAO;MACVG,OAAO,EAAGG,SAAkB,IAAK;QAC/BV,YAAY,GAAG,IAAI;QACnBO,OAAO,CAACG,SAAS,CAAC;MACpB;IACF,CAAC;IACDV,YAAY,GAAGQ,KAAK;IACpBP,KAAK,CAACU,OAAO,CAAEC,CAAC,IAAKA,CAAC,CAACJ,KAAK,CAAC,CAAC;EAChC,CAAC,CAAC;AACJ","ignoreList":[]}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ export { confirm } from "./confirm.js";
4
+ export { ConfirmHost } from "./ConfirmHost.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["confirm","ConfirmHost"],"sourceRoot":"../../../../../src","sources":["components/ui/Confirm/index.ts"],"mappings":";;AAAA,SAASA,OAAO,QAAQ,cAAW;AACnC,SAASC,WAAW,QAAQ,kBAAe","ignoreList":[]}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ import { StyleSheet } from 'react-native';
4
+ import { fw, r, space, type as t } from "../../../theme/index.js";
5
+ /** Confirm 对话框 styles —— 原生 Modal(transparent + slide)底部弹出卡片:
6
+ * backdrop 半透黑铺满、点击取消;sheet 贴底圆角顶。不依赖 @gorhom。 */
7
+ export const makeStyles = c => StyleSheet.create({
8
+ backdrop: {
9
+ flex: 1,
10
+ backgroundColor: c.scrim,
11
+ justifyContent: 'flex-end'
12
+ },
13
+ sheet: {
14
+ backgroundColor: c.surface,
15
+ borderTopLeftRadius: r(20),
16
+ borderTopRightRadius: r(20),
17
+ paddingTop: space['7']
18
+ },
19
+ body: {
20
+ paddingHorizontal: space['9'],
21
+ gap: space['5']
22
+ },
23
+ title: {
24
+ fontSize: t.heroSm,
25
+ fontWeight: fw.semi,
26
+ color: c.foreground,
27
+ letterSpacing: -0.2
28
+ },
29
+ message: {
30
+ fontSize: t.body,
31
+ color: c.foregroundMuted,
32
+ lineHeight: t.body * 1.45
33
+ },
34
+ actions: {
35
+ flexDirection: 'row',
36
+ gap: space['4'],
37
+ paddingHorizontal: space['9'],
38
+ paddingTop: space['7']
39
+ }
40
+ });
41
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["StyleSheet","fw","r","space","type","t","makeStyles","c","create","backdrop","flex","backgroundColor","scrim","justifyContent","sheet","surface","borderTopLeftRadius","borderTopRightRadius","paddingTop","body","paddingHorizontal","gap","title","fontSize","heroSm","fontWeight","semi","color","foreground","letterSpacing","message","foregroundMuted","lineHeight","actions","flexDirection"],"sourceRoot":"../../../../../src","sources":["components/ui/Confirm/styles.ts"],"mappings":";;AAAA,SAASA,UAAU,QAAQ,cAAc;AACzC,SAASC,EAAE,EAAEC,CAAC,EAAEC,KAAK,EAAEC,IAAI,IAAIC,CAAC,QAAQ,yBAAgB;AAGxD;AACA;AACA,OAAO,MAAMC,UAAU,GAAIC,CAAc,IACvCP,UAAU,CAACQ,MAAM,CAAC;EAChBC,QAAQ,EAAE;IACRC,IAAI,EAAE,CAAC;IACPC,eAAe,EAAEJ,CAAC,CAACK,KAAK;IACxBC,cAAc,EAAE;EAClB,CAAC;EACDC,KAAK,EAAE;IACLH,eAAe,EAAEJ,CAAC,CAACQ,OAAO;IAC1BC,mBAAmB,EAAEd,CAAC,CAAC,EAAE,CAAC;IAC1Be,oBAAoB,EAAEf,CAAC,CAAC,EAAE,CAAC;IAC3BgB,UAAU,EAAEf,KAAK,CAAC,GAAG;EACvB,CAAC;EACDgB,IAAI,EAAE;IACJC,iBAAiB,EAAEjB,KAAK,CAAC,GAAG,CAAC;IAC7BkB,GAAG,EAAElB,KAAK,CAAC,GAAG;EAChB,CAAC;EACDmB,KAAK,EAAE;IACLC,QAAQ,EAAElB,CAAC,CAACmB,MAAM;IAClBC,UAAU,EAAExB,EAAE,CAACyB,IAAI;IACnBC,KAAK,EAAEpB,CAAC,CAACqB,UAAU;IACnBC,aAAa,EAAE,CAAC;EAClB,CAAC;EACDC,OAAO,EAAE;IACPP,QAAQ,EAAElB,CAAC,CAACc,IAAI;IAChBQ,KAAK,EAAEpB,CAAC,CAACwB,eAAe;IACxBC,UAAU,EAAE3B,CAAC,CAACc,IAAI,GAAG;EACvB,CAAC;EACDc,OAAO,EAAE;IACPC,aAAa,EAAE,KAAK;IACpBb,GAAG,EAAElB,KAAK,CAAC,GAAG,CAAC;IACfiB,iBAAiB,EAAEjB,KAAK,CAAC,GAAG,CAAC;IAC7Be,UAAU,EAAEf,KAAK,CAAC,GAAG;EACvB;AACF,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../../../src","sources":["components/ui/Confirm/types.ts"],"mappings":"","ignoreList":[]}
@@ -8,6 +8,7 @@ export { Carousel } from "./Carousel/index.js";
8
8
  export { Cell, List } from "./Cell/index.js";
9
9
  export { Checkbox } from "./Checkbox/index.js";
10
10
  export { Chip } from "./Chip/index.js";
11
+ export { confirm, ConfirmHost } from "./Confirm/index.js";
11
12
  export { DrawerHeader } from "./DrawerHeader/index.js";
12
13
  export { Empty } from "./Empty/index.js";
13
14
  export { EntryCard } from "./EntryCard/index.js";
@@ -1 +1 @@
1
- {"version":3,"names":["Avatar","BlurLayer","Button","Card","Carousel","Cell","List","Checkbox","Chip","DrawerHeader","Empty","EntryCard","Form","FormGroup","FormRow","Grid","Icon","IconButton","Input","Logo","NavBar","PasswordInput","Pulse","PulseDot","usePulse","Radio","Reveal","Search","Skeleton","Segmented","Spinner","StatusDot","Stepper","Switch","TabBar","Tabs","Tag","Textarea","Thumbnail","toast","ToastHost"],"sourceRoot":"../../../../src","sources":["components/ui/index.ts"],"mappings":";;AAAA,SAASA,MAAM,QAAQ,mBAAU;AAEjC,SAASC,SAAS,QAAQ,sBAAa;AAEvC,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,QAAQ,QAAQ,qBAAY;AAErC,SAASC,IAAI,EAAEC,IAAI,QAAQ,iBAAQ;AAEnC,SAASC,QAAQ,QAAQ,qBAAY;AAErC,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,YAAY,QAAQ,yBAAgB;AAE7C,SAASC,KAAK,QAAQ,kBAAS;AAE/B,SAASC,SAAS,QAAQ,sBAAa;AAEvC,SAASC,IAAI,EAAEC,SAAS,EAAEC,OAAO,QAAQ,iBAAQ;AAEjD,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,UAAU,QAAQ,uBAAc;AAEzC,SAASC,KAAK,QAAQ,kBAAS;AAE/B,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,aAAa,QAAQ,0BAAiB;AAE/C,SAASC,KAAK,EAAEC,QAAQ,EAAEC,QAAQ,QAAQ,kBAAS;AAEnD,SAASC,KAAK,QAAQ,kBAAS;AAE/B,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,QAAQ,QAAQ,qBAAY;AAErC,SAASC,SAAS,QAAQ,sBAAa;AAEvC,SAASC,OAAO,QAAQ,oBAAW;AAEnC,SAASC,SAAS,QAAQ,sBAAa;AAMvC,SAASC,OAAO,QAAQ,oBAAW;AAEnC,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,GAAG,QAAQ,gBAAO;AAE3B,SAASC,QAAQ,QAAQ,qBAAY;AAErC,SAASC,SAAS,QAAQ,sBAAa;AAEvC,SAASC,KAAK,EAAEC,SAAS,QAAQ,kBAAS","ignoreList":[]}
1
+ {"version":3,"names":["Avatar","BlurLayer","Button","Card","Carousel","Cell","List","Checkbox","Chip","confirm","ConfirmHost","DrawerHeader","Empty","EntryCard","Form","FormGroup","FormRow","Grid","Icon","IconButton","Input","Logo","NavBar","PasswordInput","Pulse","PulseDot","usePulse","Radio","Reveal","Search","Skeleton","Segmented","Spinner","StatusDot","Stepper","Switch","TabBar","Tabs","Tag","Textarea","Thumbnail","toast","ToastHost"],"sourceRoot":"../../../../src","sources":["components/ui/index.ts"],"mappings":";;AAAA,SAASA,MAAM,QAAQ,mBAAU;AAEjC,SAASC,SAAS,QAAQ,sBAAa;AAEvC,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,QAAQ,QAAQ,qBAAY;AAErC,SAASC,IAAI,EAAEC,IAAI,QAAQ,iBAAQ;AAEnC,SAASC,QAAQ,QAAQ,qBAAY;AAErC,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,OAAO,EAAEC,WAAW,QAAQ,oBAAW;AAEhD,SAASC,YAAY,QAAQ,yBAAgB;AAE7C,SAASC,KAAK,QAAQ,kBAAS;AAE/B,SAASC,SAAS,QAAQ,sBAAa;AAEvC,SAASC,IAAI,EAAEC,SAAS,EAAEC,OAAO,QAAQ,iBAAQ;AAEjD,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,UAAU,QAAQ,uBAAc;AAEzC,SAASC,KAAK,QAAQ,kBAAS;AAE/B,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,aAAa,QAAQ,0BAAiB;AAE/C,SAASC,KAAK,EAAEC,QAAQ,EAAEC,QAAQ,QAAQ,kBAAS;AAEnD,SAASC,KAAK,QAAQ,kBAAS;AAE/B,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,QAAQ,QAAQ,qBAAY;AAErC,SAASC,SAAS,QAAQ,sBAAa;AAEvC,SAASC,OAAO,QAAQ,oBAAW;AAEnC,SAASC,SAAS,QAAQ,sBAAa;AAMvC,SAASC,OAAO,QAAQ,oBAAW;AAEnC,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,GAAG,QAAQ,gBAAO;AAE3B,SAASC,QAAQ,QAAQ,qBAAY;AAErC,SAASC,SAAS,QAAQ,sBAAa;AAEvC,SAASC,KAAK,EAAEC,SAAS,QAAQ,kBAAS","ignoreList":[]}
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ /**
3
+ * Confirm 对话框宿主 —— App 根挂一次,监听 `confirm()` 调用并渲染。
4
+ *
5
+ * 原生 RN `Modal`(transparent + animationType slide)从底部滑入,backdrop 点击
6
+ * 取消、内层 sheet 拦截点击不冒泡。**不依赖 @gorhom**(0.6.0 去 @gorhom 后改为
7
+ * 纯 RN Modal + pub/sub 实现)。
8
+ */
9
+ export declare function ConfirmHost(): React.JSX.Element | null;
10
+ //# sourceMappingURL=ConfirmHost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfirmHost.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Confirm/ConfirmHost.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAShE;;;;;;GAMG;AACH,wBAAgB,WAAW,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CA0EtD"}
@@ -0,0 +1,20 @@
1
+ import type { ConfirmOptions, Subscriber } from './types';
2
+ export declare const _subs: Set<Subscriber>;
3
+ /**
4
+ * 弹出确认对话框,返回 Promise<boolean>。
5
+ * - 用户点确认 → resolve(true)
6
+ * - 用户点取消 / 点 backdrop / 拖关闭 → resolve(false)
7
+ *
8
+ * 示例:
9
+ * ```ts
10
+ * const ok = await confirm({
11
+ * title: '确认注销账号?',
12
+ * message: '注销后所有数据删除,无法恢复',
13
+ * confirmLabel: '确认注销',
14
+ * destructive: true,
15
+ * });
16
+ * if (ok) doLogout();
17
+ * ```
18
+ */
19
+ export declare function confirm(options: ConfirmOptions): Promise<boolean>;
20
+ //# sourceMappingURL=confirm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Confirm/confirm.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAgB,UAAU,EAAE,MAAM,SAAS,CAAC;AAMxE,eAAO,MAAM,KAAK,iBAAwB,CAAC;AAE3C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAmBjE"}
@@ -0,0 +1,4 @@
1
+ export { confirm } from './confirm';
2
+ export { ConfirmHost } from './ConfirmHost';
3
+ export type { ConfirmOptions } from './types';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Confirm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type { ColorTokens } from '../../../theme';
2
+ /** Confirm 对话框 styles —— 原生 Modal(transparent + slide)底部弹出卡片:
3
+ * backdrop 半透黑铺满、点击取消;sheet 贴底圆角顶。不依赖 @gorhom。 */
4
+ export declare const makeStyles: (c: ColorTokens) => Readonly<{
5
+ backdrop: {
6
+ flex: number;
7
+ backgroundColor: string;
8
+ justifyContent: "flex-end";
9
+ };
10
+ sheet: {
11
+ backgroundColor: string;
12
+ borderTopLeftRadius: number;
13
+ borderTopRightRadius: number;
14
+ paddingTop: number;
15
+ };
16
+ body: {
17
+ paddingHorizontal: number;
18
+ gap: number;
19
+ };
20
+ title: {
21
+ fontSize: number;
22
+ fontWeight: "600";
23
+ color: string;
24
+ letterSpacing: number;
25
+ };
26
+ message: {
27
+ fontSize: number;
28
+ color: string;
29
+ lineHeight: number;
30
+ };
31
+ actions: {
32
+ flexDirection: "row";
33
+ gap: number;
34
+ paddingHorizontal: number;
35
+ paddingTop: number;
36
+ };
37
+ }>;
38
+ //# sourceMappingURL=styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Confirm/styles.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD;mDACmD;AACnD,eAAO,MAAM,UAAU,GAAI,GAAG,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkCrC,CAAC"}
@@ -0,0 +1,21 @@
1
+ /** Confirm 入参。 */
2
+ export type ConfirmOptions = {
3
+ /** 主标题 —— 短且明确,如 "确认注销账号?" */
4
+ title: string;
5
+ /** 说明文本 —— 1-2 句解释操作后果。可选 */
6
+ message?: string;
7
+ /** 确认按钮文案,默认 "确认" */
8
+ confirmLabel?: string;
9
+ /** 取消按钮文案,默认 "取消" */
10
+ cancelLabel?: string;
11
+ /** 标记为破坏性操作 —— 确认按钮变红(c.error),用于"删除 / 注销 / 取消订单" */
12
+ destructive?: boolean;
13
+ };
14
+ /** Host 内部 entry —— options + resolve 回调,用户点 确认/取消/backdrop 时 resolve。 */
15
+ export type ConfirmEntry = ConfirmOptions & {
16
+ id: number;
17
+ resolve: (confirmed: boolean) => void;
18
+ };
19
+ /** ConfirmHost 监听器签名 —— 收到 entry 渲染对话框;收到 null 表示关闭。 */
20
+ export type Subscriber = (entry: ConfirmEntry | null) => void;
21
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Confirm/types.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAClB,MAAM,MAAM,cAAc,GAAG;IAC3B,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qBAAqB;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qBAAqB;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,0EAA0E;AAC1E,MAAM,MAAM,YAAY,GAAG,cAAc,GAAG;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC,CAAC;AAEF,wDAAwD;AACxD,MAAM,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,KAAK,IAAI,CAAC"}
@@ -14,6 +14,8 @@ export { Checkbox } from './Checkbox';
14
14
  export type { CheckboxProps } from './Checkbox';
15
15
  export { Chip } from './Chip';
16
16
  export type { ChipProps } from './Chip';
17
+ export { confirm, ConfirmHost } from './Confirm';
18
+ export type { ConfirmOptions } from './Confirm';
17
19
  export { DrawerHeader } from './DrawerHeader';
18
20
  export type { DrawerHeaderProps } from './DrawerHeader';
19
21
  export { Empty } from './Empty';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unif/react-native-design",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "Unif 设计系统:theme + icons + utils + components",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./lib/typescript/src/index.d.ts",
@@ -0,0 +1,91 @@
1
+ import React, { useCallback, useEffect, useState } from 'react';
2
+ import { Modal, Pressable, Text, View } from 'react-native';
3
+ import { useSafeAreaInsets } from 'react-native-safe-area-context';
4
+ import { space, useThemedStyles } from '../../../theme';
5
+ import { Button } from '../Button';
6
+ import { _subs } from './confirm';
7
+ import { makeStyles } from './styles';
8
+ import type { ConfirmEntry, Subscriber } from './types';
9
+
10
+ /**
11
+ * Confirm 对话框宿主 —— App 根挂一次,监听 `confirm()` 调用并渲染。
12
+ *
13
+ * 原生 RN `Modal`(transparent + animationType slide)从底部滑入,backdrop 点击
14
+ * 取消、内层 sheet 拦截点击不冒泡。**不依赖 @gorhom**(0.6.0 去 @gorhom 后改为
15
+ * 纯 RN Modal + pub/sub 实现)。
16
+ */
17
+ export function ConfirmHost(): React.JSX.Element | null {
18
+ const styles = useThemedStyles(makeStyles);
19
+ const insets = useSafeAreaInsets();
20
+ const [entry, setEntry] = useState<ConfirmEntry | null>(null);
21
+
22
+ useEffect(() => {
23
+ const sub: Subscriber = (next) => setEntry(next);
24
+ _subs.add(sub);
25
+ return () => {
26
+ _subs.delete(sub);
27
+ };
28
+ }, []);
29
+
30
+ const handleConfirm = useCallback(() => {
31
+ entry?.resolve(true);
32
+ setEntry(null);
33
+ }, [entry]);
34
+
35
+ const handleCancel = useCallback(() => {
36
+ entry?.resolve(false);
37
+ setEntry(null);
38
+ }, [entry]);
39
+
40
+ return (
41
+ <Modal
42
+ visible={!!entry}
43
+ transparent
44
+ animationType="slide"
45
+ statusBarTranslucent
46
+ onRequestClose={handleCancel}
47
+ >
48
+ {/* backdrop 点击取消;内层 sheet onPress 空占位拦截冒泡 */}
49
+ <Pressable
50
+ style={styles.backdrop}
51
+ onPress={handleCancel}
52
+ accessibilityRole="button"
53
+ accessibilityLabel="关闭"
54
+ >
55
+ <Pressable
56
+ style={[styles.sheet, { paddingBottom: insets.bottom + space['7'] }]}
57
+ onPress={() => {}}
58
+ >
59
+ {entry ? (
60
+ <>
61
+ <View style={styles.body}>
62
+ <Text style={styles.title} accessibilityRole="header">
63
+ {entry.title}
64
+ </Text>
65
+ {entry.message ? (
66
+ <Text style={styles.message}>{entry.message}</Text>
67
+ ) : null}
68
+ </View>
69
+ <View style={styles.actions}>
70
+ <Button
71
+ testID="confirm-cancel"
72
+ label={entry.cancelLabel ?? '取消'}
73
+ variant="secondary"
74
+ block
75
+ onPress={handleCancel}
76
+ />
77
+ <Button
78
+ testID="confirm-ok"
79
+ label={entry.confirmLabel ?? '确认'}
80
+ variant={entry.destructive ? 'danger' : 'primary'}
81
+ block
82
+ onPress={handleConfirm}
83
+ />
84
+ </View>
85
+ </>
86
+ ) : null}
87
+ </Pressable>
88
+ </Pressable>
89
+ </Modal>
90
+ );
91
+ }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * 命令式 `confirm()` API —— 跟 `<ConfirmHost />` 配对使用。
3
+ *
4
+ * 业务任意位置 `const ok = await confirm({title, message, ...})`,
5
+ * 不用维护 useState / open / onClose。
6
+ *
7
+ * 同一时间只允许 1 个 confirm 活跃;若已有正在显示,新请求立即 resolve(false) 并 warn。
8
+ */
9
+ import { createLogger } from '../../../utils/logger';
10
+ import type { ConfirmOptions, ConfirmEntry, Subscriber } from './types';
11
+
12
+ const log = createLogger('confirm');
13
+
14
+ let _id = 0;
15
+ let _activeEntry: ConfirmEntry | null = null;
16
+ export const _subs = new Set<Subscriber>();
17
+
18
+ /**
19
+ * 弹出确认对话框,返回 Promise<boolean>。
20
+ * - 用户点确认 → resolve(true)
21
+ * - 用户点取消 / 点 backdrop / 拖关闭 → resolve(false)
22
+ *
23
+ * 示例:
24
+ * ```ts
25
+ * const ok = await confirm({
26
+ * title: '确认注销账号?',
27
+ * message: '注销后所有数据删除,无法恢复',
28
+ * confirmLabel: '确认注销',
29
+ * destructive: true,
30
+ * });
31
+ * if (ok) doLogout();
32
+ * ```
33
+ */
34
+ export function confirm(options: ConfirmOptions): Promise<boolean> {
35
+ if (_activeEntry) {
36
+ log.warn(
37
+ 'confirm() 已有一个对话框在显示,新请求被拒绝(同一时间只 1 个,避免叠加)。'
38
+ );
39
+ return Promise.resolve(false);
40
+ }
41
+ return new Promise<boolean>((resolve) => {
42
+ const entry: ConfirmEntry = {
43
+ id: ++_id,
44
+ ...options,
45
+ resolve: (confirmed: boolean) => {
46
+ _activeEntry = null;
47
+ resolve(confirmed);
48
+ },
49
+ };
50
+ _activeEntry = entry;
51
+ _subs.forEach((s) => s(entry));
52
+ });
53
+ }
@@ -0,0 +1,3 @@
1
+ export { confirm } from './confirm';
2
+ export { ConfirmHost } from './ConfirmHost';
3
+ export type { ConfirmOptions } from './types';
@@ -0,0 +1,41 @@
1
+ import { StyleSheet } from 'react-native';
2
+ import { fw, r, space, type as t } from '../../../theme';
3
+ import type { ColorTokens } from '../../../theme';
4
+
5
+ /** Confirm 对话框 styles —— 原生 Modal(transparent + slide)底部弹出卡片:
6
+ * backdrop 半透黑铺满、点击取消;sheet 贴底圆角顶。不依赖 @gorhom。 */
7
+ export const makeStyles = (c: ColorTokens) =>
8
+ StyleSheet.create({
9
+ backdrop: {
10
+ flex: 1,
11
+ backgroundColor: c.scrim,
12
+ justifyContent: 'flex-end',
13
+ },
14
+ sheet: {
15
+ backgroundColor: c.surface,
16
+ borderTopLeftRadius: r(20),
17
+ borderTopRightRadius: r(20),
18
+ paddingTop: space['7'],
19
+ },
20
+ body: {
21
+ paddingHorizontal: space['9'],
22
+ gap: space['5'],
23
+ },
24
+ title: {
25
+ fontSize: t.heroSm,
26
+ fontWeight: fw.semi,
27
+ color: c.foreground,
28
+ letterSpacing: -0.2,
29
+ },
30
+ message: {
31
+ fontSize: t.body,
32
+ color: c.foregroundMuted,
33
+ lineHeight: t.body * 1.45,
34
+ },
35
+ actions: {
36
+ flexDirection: 'row',
37
+ gap: space['4'],
38
+ paddingHorizontal: space['9'],
39
+ paddingTop: space['7'],
40
+ },
41
+ });
@@ -0,0 +1,22 @@
1
+ /** Confirm 入参。 */
2
+ export type ConfirmOptions = {
3
+ /** 主标题 —— 短且明确,如 "确认注销账号?" */
4
+ title: string;
5
+ /** 说明文本 —— 1-2 句解释操作后果。可选 */
6
+ message?: string;
7
+ /** 确认按钮文案,默认 "确认" */
8
+ confirmLabel?: string;
9
+ /** 取消按钮文案,默认 "取消" */
10
+ cancelLabel?: string;
11
+ /** 标记为破坏性操作 —— 确认按钮变红(c.error),用于"删除 / 注销 / 取消订单" */
12
+ destructive?: boolean;
13
+ };
14
+
15
+ /** Host 内部 entry —— options + resolve 回调,用户点 确认/取消/backdrop 时 resolve。 */
16
+ export type ConfirmEntry = ConfirmOptions & {
17
+ id: number;
18
+ resolve: (confirmed: boolean) => void;
19
+ };
20
+
21
+ /** ConfirmHost 监听器签名 —— 收到 entry 渲染对话框;收到 null 表示关闭。 */
22
+ export type Subscriber = (entry: ConfirmEntry | null) => void;
@@ -14,6 +14,8 @@ export { Checkbox } from './Checkbox';
14
14
  export type { CheckboxProps } from './Checkbox';
15
15
  export { Chip } from './Chip';
16
16
  export type { ChipProps } from './Chip';
17
+ export { confirm, ConfirmHost } from './Confirm';
18
+ export type { ConfirmOptions } from './Confirm';
17
19
  export { DrawerHeader } from './DrawerHeader';
18
20
  export type { DrawerHeaderProps } from './DrawerHeader';
19
21
  export { Empty } from './Empty';