@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.
- package/lib/module/components/ui/Confirm/ConfirmHost.js +85 -0
- package/lib/module/components/ui/Confirm/ConfirmHost.js.map +1 -0
- package/lib/module/components/ui/Confirm/confirm.js +51 -0
- package/lib/module/components/ui/Confirm/confirm.js.map +1 -0
- package/lib/module/components/ui/Confirm/index.js +5 -0
- package/lib/module/components/ui/Confirm/index.js.map +1 -0
- package/lib/module/components/ui/Confirm/styles.js +41 -0
- package/lib/module/components/ui/Confirm/styles.js.map +1 -0
- package/lib/module/components/ui/Confirm/types.js +2 -0
- package/lib/module/components/ui/Confirm/types.js.map +1 -0
- package/lib/module/components/ui/index.js +1 -0
- package/lib/module/components/ui/index.js.map +1 -1
- package/lib/typescript/src/components/ui/Confirm/ConfirmHost.d.ts +10 -0
- package/lib/typescript/src/components/ui/Confirm/ConfirmHost.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Confirm/confirm.d.ts +20 -0
- package/lib/typescript/src/components/ui/Confirm/confirm.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Confirm/index.d.ts +4 -0
- package/lib/typescript/src/components/ui/Confirm/index.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Confirm/styles.d.ts +38 -0
- package/lib/typescript/src/components/ui/Confirm/styles.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Confirm/types.d.ts +21 -0
- package/lib/typescript/src/components/ui/Confirm/types.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/index.d.ts +2 -0
- package/lib/typescript/src/components/ui/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/ui/Confirm/ConfirmHost.tsx +91 -0
- package/src/components/ui/Confirm/confirm.ts +53 -0
- package/src/components/ui/Confirm/index.ts +3 -0
- package/src/components/ui/Confirm/styles.ts +41 -0
- package/src/components/ui/Confirm/types.ts +22 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|
@@ -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,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';
|