@hjmds/react-native 1.19.0 → 1.21.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/dist/actions.d.ts +10 -0
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js.map +1 -1
- package/dist/authoring-tools.d.ts +24 -0
- package/dist/authoring-tools.d.ts.map +1 -0
- package/dist/authoring-tools.js +28 -0
- package/dist/authoring-tools.js.map +1 -0
- package/dist/calendar.d.ts.map +1 -1
- package/dist/calendar.js +2 -1
- package/dist/calendar.js.map +1 -1
- package/dist/chart.d.ts +138 -0
- package/dist/chart.d.ts.map +1 -0
- package/dist/chart.js +271 -0
- package/dist/chart.js.map +1 -0
- package/dist/collection-editing.d.ts +63 -0
- package/dist/collection-editing.d.ts.map +1 -0
- package/dist/collection-editing.js +114 -0
- package/dist/collection-editing.js.map +1 -0
- package/dist/communication.d.ts +51 -0
- package/dist/communication.d.ts.map +1 -0
- package/dist/communication.js +68 -0
- package/dist/communication.js.map +1 -0
- package/dist/data-table.d.ts +48 -0
- package/dist/data-table.d.ts.map +1 -0
- package/dist/data-table.js +90 -0
- package/dist/data-table.js.map +1 -0
- package/dist/data-workflows.d.ts +68 -0
- package/dist/data-workflows.d.ts.map +1 -0
- package/dist/data-workflows.js +60 -0
- package/dist/data-workflows.js.map +1 -0
- package/dist/evidence.d.ts +1 -1
- package/dist/evidence.js +1 -1
- package/dist/internal/recipe-button.d.ts +4 -0
- package/dist/internal/recipe-button.d.ts.map +1 -1
- package/dist/internal/recipe-button.js +24 -5
- package/dist/internal/recipe-button.js.map +1 -1
- package/dist/internal/use-composition-action.d.ts +17 -0
- package/dist/internal/use-composition-action.d.ts.map +1 -0
- package/dist/internal/use-composition-action.js +17 -0
- package/dist/internal/use-composition-action.js.map +1 -0
- package/dist/media-transport.d.ts +22 -0
- package/dist/media-transport.d.ts.map +1 -0
- package/dist/media-transport.js +49 -0
- package/dist/media-transport.js.map +1 -0
- package/dist/navigation.d.ts +3 -1
- package/dist/navigation.d.ts.map +1 -1
- package/dist/navigation.js +41 -12
- package/dist/navigation.js.map +1 -1
- package/dist/screen-flows.d.ts +3 -2
- package/dist/screen-flows.d.ts.map +1 -1
- package/dist/screen-flows.js +1 -1
- package/dist/screen-flows.js.map +1 -1
- package/dist/screens.d.ts +8 -2
- package/dist/screens.d.ts.map +1 -1
- package/dist/screens.js +21 -7
- package/dist/screens.js.map +1 -1
- package/dist/social-compositions.d.ts +52 -0
- package/dist/social-compositions.d.ts.map +1 -0
- package/dist/social-compositions.js +40 -0
- package/dist/social-compositions.js.map +1 -0
- package/dist/streaming-answer.d.ts +24 -0
- package/dist/streaming-answer.d.ts.map +1 -0
- package/dist/streaming-answer.js +57 -0
- package/dist/streaming-answer.js.map +1 -0
- package/dist/table-family.d.ts +46 -0
- package/dist/table-family.d.ts.map +1 -0
- package/dist/table-family.js +56 -0
- package/dist/table-family.js.map +1 -0
- package/dist/task-controls.d.ts +47 -0
- package/dist/task-controls.d.ts.map +1 -0
- package/dist/task-controls.js +46 -0
- package/dist/task-controls.js.map +1 -0
- package/dist/toggle-feedback.d.ts +26 -0
- package/dist/toggle-feedback.d.ts.map +1 -0
- package/dist/toggle-feedback.js +46 -0
- package/dist/toggle-feedback.js.map +1 -0
- package/dist/transfer-task.d.ts +18 -0
- package/dist/transfer-task.d.ts.map +1 -0
- package/dist/transfer-task.js +56 -0
- package/dist/transfer-task.js.map +1 -0
- package/package.json +75 -3
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { resolveTaskChoice, resolvePasswordRules, resolvePriceOption } from "@hjmds/design-contracts/task-controls";
|
|
4
|
+
import { Button } from "./actions.js";
|
|
5
|
+
import { Menu } from "./navigation.js";
|
|
6
|
+
import { PasswordField } from "./inputs.js";
|
|
7
|
+
import { RadioGroup } from "./inputs.js";
|
|
8
|
+
import { Card } from "./data-display.js";
|
|
9
|
+
import { Progress } from "./feedback.js";
|
|
10
|
+
import { Stack, Text } from "./primitives.js";
|
|
11
|
+
import { useCompositionAction } from "./internal/use-composition-action.js";
|
|
12
|
+
function ChoiceMenu(props) {
|
|
13
|
+
const available = props.choices.some(choice => !choice.disabled);
|
|
14
|
+
if (!available)
|
|
15
|
+
return _jsx(Button, { disabled: true, children: props.label });
|
|
16
|
+
return _jsx(Menu, { triggerLabel: props.label, dismissLabel: props.dismissLabel, disabled: props.disabled, busy: props.pending === true, renderTrigger: trigger => _jsx(Button, { tone: "secondary", onPress: trigger.onPress, disabled: props.disabled, loading: props.pending === true, children: props.label }), items: props.choices, selection: { mode: "single", selectedKey: props.selectedId, onSelectionChange: () => undefined }, onSelectionAfterDismiss: id => props.onChoose(id) });
|
|
17
|
+
}
|
|
18
|
+
function Failure({ failed, label }) {
|
|
19
|
+
return failed ? _jsx(Text, { accessibilityRole: "alert", accessibilityLiveRegion: "assertive", tone: "danger", align: "center", children: label }) : null;
|
|
20
|
+
}
|
|
21
|
+
export function SplitAction(props) {
|
|
22
|
+
const mode = resolveTaskChoice(props.modes, props.modeId), action = useCompositionAction(props.disabled);
|
|
23
|
+
const locked = props.disabled === true || action.pending;
|
|
24
|
+
return _jsxs(Stack, { gap: "sm", children: [_jsxs(Stack, { axis: "inline", gap: "xs", wrap: true, children: [_jsx(Button, { loading: action.pending, disabled: props.disabled === true || mode.disabled === true, onPress: () => { if (!mode.disabled)
|
|
25
|
+
void action.run(mode.id, () => props.onExecute(mode.id)); }, children: props.executeLabel(mode) }), _jsx(ChoiceMenu, { choices: props.modes, selectedId: mode.id, label: props.menuLabel, dismissLabel: props.dismissLabel, disabled: locked, onChoose: id => { if (!locked && !resolveTaskChoice(props.modes, id).disabled)
|
|
26
|
+
props.onModeChange(id); } })] }), _jsx(Failure, { failed: action.failed, label: props.errorLabel })] });
|
|
27
|
+
}
|
|
28
|
+
export function AccountSwitcher(props) {
|
|
29
|
+
const account = resolveTaskChoice(props.accounts, props.accountId), action = useCompositionAction(props.disabled);
|
|
30
|
+
const locked = props.disabled === true || action.pending;
|
|
31
|
+
// The controlled account stays confirmed until the product completes the session change.
|
|
32
|
+
return _jsxs(Stack, { gap: "sm", children: [_jsx(Text, { emphasis: "strong", children: account.label }), _jsx(ChoiceMenu, { choices: props.accounts, selectedId: account.id, label: props.label, dismissLabel: props.dismissLabel, disabled: locked, pending: action.pending, onChoose: id => { if (id !== account.id && !resolveTaskChoice(props.accounts, id).disabled)
|
|
33
|
+
void action.run(id, () => props.onSwitch(id)); } }), _jsx(Failure, { failed: action.failed, label: props.errorLabel })] });
|
|
34
|
+
}
|
|
35
|
+
export function PasswordRulesField({ rules, progressLabel, summaryLabel, ruleLabel, ...field }) {
|
|
36
|
+
const state = resolvePasswordRules(field.value, rules);
|
|
37
|
+
return _jsxs(Stack, { gap: "sm", children: [_jsx(PasswordField, { ...field }), _jsx(Progress, { label: progressLabel, value: state.satisfied, max: state.total, valueText: summaryLabel(state.satisfied, state.total) }), state.rules.map(rule => _jsx(Text, { variant: "caption", tone: rule.satisfied ? "primary" : "muted", children: ruleLabel(rule) }, rule.id))] });
|
|
38
|
+
}
|
|
39
|
+
export function PricingChoice(props) {
|
|
40
|
+
const option = resolvePriceOption(props.options, props.selectedId), action = useCompositionAction(props.disabled);
|
|
41
|
+
const locked = props.disabled === true || action.pending;
|
|
42
|
+
return _jsx(Card, { title: props.label, children: _jsxs(Stack, { gap: "md", children: [_jsx(RadioGroup, { accessibilityLabel: props.label, presentation: "card", value: option.id, disabled: locked, items: props.options.map(price => ({ value: price.id, label: price.label, description: props.formatPrice(price), disabled: price.disabled === true })), onValueChange: id => { if (id !== null && !locked && !resolveTaskChoice(props.options, id).disabled)
|
|
43
|
+
props.onSelectionChange(id); } }), _jsx(Text, { emphasis: "strong", children: props.formatPrice(option) }), option.benefits.map((benefit, index) => _jsx(Text, { children: benefit }, index)), _jsx(Button, { loading: action.pending, disabled: props.disabled === true || option.disabled === true, onPress: () => { if (!option.disabled)
|
|
44
|
+
void action.run(option.id, () => props.onContinue(Object.freeze({ ...option, benefits: Object.freeze([...option.benefits]) }))); }, children: props.continueLabel }), _jsx(Failure, { failed: action.failed, label: props.errorLabel })] }) });
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=task-controls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-controls.js","sourceRoot":"","sources":["../src/task-controls.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import { type ToggleFeedbackEffect, type ToggleFeedbackState } from "@hjmds/design-contracts/toggle-feedback";
|
|
3
|
+
export type ToggleFeedbackButtonProps = Readonly<{
|
|
4
|
+
entityId: string;
|
|
5
|
+
state: ToggleFeedbackState;
|
|
6
|
+
effect: ToggleFeedbackEffect;
|
|
7
|
+
locale: string;
|
|
8
|
+
icon?: ReactNode;
|
|
9
|
+
renderIcon?: (state: Readonly<{
|
|
10
|
+
selected: boolean;
|
|
11
|
+
pending: boolean;
|
|
12
|
+
}>) => ReactNode;
|
|
13
|
+
labels: Readonly<{
|
|
14
|
+
select: string;
|
|
15
|
+
selected: string;
|
|
16
|
+
pending: string;
|
|
17
|
+
count: string;
|
|
18
|
+
error: string;
|
|
19
|
+
}>;
|
|
20
|
+
/** Update confirmed state from the real API snapshot before resolving. */
|
|
21
|
+
onSelectedChange: (selected: boolean) => void | Promise<void>;
|
|
22
|
+
disabled?: boolean;
|
|
23
|
+
active?: boolean;
|
|
24
|
+
}>;
|
|
25
|
+
export declare function ToggleFeedbackButton(props: ToggleFeedbackButtonProps): import("react").JSX.Element;
|
|
26
|
+
//# sourceMappingURL=toggle-feedback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toggle-feedback.d.ts","sourceRoot":"","sources":["../src/toggle-feedback.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAkD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvF,OAAO,EAAwG,KAAK,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AA0BpN,MAAM,MAAM,yBAAyB,GAAG,QAAQ,CAAC;IAC/C,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,oBAAoB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAC7G,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,KAAK,SAAS,CAAC;IACrF,MAAM,EAAE,QAAQ,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtG,0EAA0E;IAC1E,gBAAgB,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CACrG,CAAC,CAAC;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,yBAAyB,+BAGpE"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef, useState } from "react";
|
|
3
|
+
import { Animated, AppState, View } from "react-native";
|
|
4
|
+
import Svg, { Circle, Path } from "react-native-svg";
|
|
5
|
+
import { resolveToggleFeedbackProposal, resolveToggleFeedbackFrame, toggleFeedbackPaths, toggleFeedbackRecipe } from "@hjmds/design-contracts/toggle-feedback";
|
|
6
|
+
import { Button } from "./actions.js";
|
|
7
|
+
import { AnimatedStatistic } from "./statistic-motion.js";
|
|
8
|
+
import { Stack, Text } from "./primitives.js";
|
|
9
|
+
import { useHjmNativeTheme } from "./provider.js";
|
|
10
|
+
import { useCompositionAction } from "./internal/use-composition-action.js";
|
|
11
|
+
function FeedbackGlyph({ effect, selected, active, icon }) {
|
|
12
|
+
const glyph = useRef(null), circle = useRef(null), rays = useRef(null), previous = useRef(selected);
|
|
13
|
+
const [value] = useState(() => new Animated.Value(1));
|
|
14
|
+
const theme = useHjmNativeTheme(), reduced = theme.environment.reducedMotion;
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
const entering = selected && !previous.current;
|
|
17
|
+
previous.current = selected;
|
|
18
|
+
const draw = (p) => { const f = resolveToggleFeedbackFrame(effect, p); glyph.current?.setNativeProps?.({ style: { transform: [{ translateY: f.translateY }, { scale: f.scale }] } }); circle.current?.setNativeProps?.({ r: f.radius, opacity: effect === "ripple" ? f.opacity : 0 }); rays.current?.setNativeProps?.({ d: f.rays, opacity: effect === "burst" ? f.opacity : 0 }); };
|
|
19
|
+
const listener = value.addListener(({ value: p }) => draw(p));
|
|
20
|
+
const settle = () => { value.stopAnimation(); value.setValue(1); draw(1); };
|
|
21
|
+
// SVG geometry cannot use the native driver. Only host props change on each frame.
|
|
22
|
+
if (!entering || reduced || !active || AppState.currentState !== "active")
|
|
23
|
+
settle();
|
|
24
|
+
else {
|
|
25
|
+
value.setValue(0);
|
|
26
|
+
Animated.timing(value, { toValue: 1, duration: toggleFeedbackRecipe.duration, useNativeDriver: false }).start();
|
|
27
|
+
}
|
|
28
|
+
const app = AppState.addEventListener("change", state => { if (state !== "active")
|
|
29
|
+
settle(); });
|
|
30
|
+
return () => { value.stopAnimation(); value.removeListener(listener); app.remove(); };
|
|
31
|
+
}, [selected, effect, active, reduced, value]);
|
|
32
|
+
const f = resolveToggleFeedbackFrame(effect, 1);
|
|
33
|
+
return _jsxs(View, { accessible: false, accessibilityElementsHidden: true, importantForAccessibility: "no-hide-descendants", style: { position: "relative", width: toggleFeedbackRecipe.glyphSize, height: toggleFeedbackRecipe.glyphSize }, children: [_jsx(View, { ref: glyph, children: icon ?? _jsx(Svg, { width: 24, height: 24, viewBox: "0 0 24 24", children: _jsx(Path, { d: toggleFeedbackPaths[effect], fill: selected ? theme.colors.contentBrand : "none", stroke: theme.colors.contentBrand, strokeWidth: 1.7, strokeLinejoin: "round" }) }) }), _jsxs(Svg, { pointerEvents: "none", width: 40, height: 40, viewBox: "0 0 40 40", style: { position: "absolute", left: -8, top: -8 }, fill: "none", stroke: theme.colors.contentBrand, strokeWidth: 1.7, children: [_jsx(Circle, { ref: circle, cx: 20, cy: 20, r: f.radius, opacity: 0 }), _jsx(Path, { ref: rays, d: f.rays, opacity: 0, strokeLinecap: "round" })] })] });
|
|
34
|
+
}
|
|
35
|
+
export function ToggleFeedbackButton(props) {
|
|
36
|
+
if (!props.entityId.trim())
|
|
37
|
+
throw new TypeError("Toggle feedback requires a stable entity id");
|
|
38
|
+
return _jsx(ToggleFeedbackBody, { ...props }, props.entityId);
|
|
39
|
+
}
|
|
40
|
+
function ToggleFeedbackBody(props) {
|
|
41
|
+
resolveToggleFeedbackProposal(props.state, props.state.selected);
|
|
42
|
+
const active = props.active !== false, action = useCompositionAction(props.disabled === true || !active), state = action.active ?? props.state;
|
|
43
|
+
const icon = props.renderIcon ? props.renderIcon({ selected: state.selected, pending: action.pending }) : props.icon;
|
|
44
|
+
return _jsxs(Stack, { gap: "sm", children: [_jsxs(Stack, { axis: "inline", gap: "md", align: "center", wrap: true, children: [_jsx(Button, { tone: "secondary", selected: state.selected, loading: action.pending, loadingLabel: props.labels.pending, disabled: props.disabled === true || !active, leading: _jsx(FeedbackGlyph, { effect: props.effect, selected: state.selected, active: active, ...(icon === undefined ? {} : { icon }) }), onPress: () => { const proposal = resolveToggleFeedbackProposal(props.state, !props.state.selected); void action.run(proposal, () => props.onSelectedChange(proposal.selected)); }, children: state.selected ? props.labels.selected : props.labels.select }), _jsx(AnimatedStatistic, { density: "compact", descriptor: { id: "selection-count", label: props.labels.count }, value: state.count, locale: props.locale, animated: active })] }), action.failed ? _jsx(Text, { accessibilityRole: "alert", accessibilityLiveRegion: "assertive", tone: "danger", align: "center", children: props.labels.error }) : null] });
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=toggle-feedback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toggle-feedback.js","sourceRoot":"","sources":["../src/toggle-feedback.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type TransferObservation, type TransferContext } from "@hjmds/design-contracts/transfer-task";
|
|
2
|
+
export type TransferTaskProps = Readonly<{
|
|
3
|
+
onTransfer: (context: TransferContext) => Promise<void>;
|
|
4
|
+
labels: Readonly<{
|
|
5
|
+
start: string;
|
|
6
|
+
queued: string;
|
|
7
|
+
transferring: string;
|
|
8
|
+
cancel: string;
|
|
9
|
+
cancelling: string;
|
|
10
|
+
cancelled: string;
|
|
11
|
+
success: string;
|
|
12
|
+
error: string;
|
|
13
|
+
}>;
|
|
14
|
+
formatProgress: (observation: TransferObservation) => string;
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
}>;
|
|
17
|
+
export declare function TransferTask(props: TransferTaskProps): import("react").JSX.Element;
|
|
18
|
+
//# sourceMappingURL=transfer-task.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer-task.d.ts","sourceRoot":"","sources":["../src/transfer-task.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAwD,KAAK,mBAAmB,EAAE,KAAK,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAK7J,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,UAAU,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,MAAM,EAAE,QAAQ,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjK,cAAc,EAAE,CAAC,WAAW,EAAE,mBAAmB,KAAK,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAClF,CAAC,CAAC;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,+BAmCpD"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useRef, useState } from "react";
|
|
4
|
+
import { isConfirmedTransferAbort, resolveTransferObservation } from "@hjmds/design-contracts/transfer-task";
|
|
5
|
+
import { Button } from "./actions.js";
|
|
6
|
+
import { Progress } from "./feedback.js";
|
|
7
|
+
import { Stack, Text } from "./primitives.js";
|
|
8
|
+
import { useCompositionAction } from "./internal/use-composition-action.js";
|
|
9
|
+
export function TransferTask(props) {
|
|
10
|
+
const action = useCompositionAction(props.disabled), mounted = useRef(true), disabled = useRef(props.disabled);
|
|
11
|
+
disabled.current = props.disabled;
|
|
12
|
+
const request = useRef(null), latest = useRef(null);
|
|
13
|
+
const [observation, setObservation] = useState(null), [cancelRequested, setCancelRequested] = useState(false), [cancelled, setCancelled] = useState(false);
|
|
14
|
+
useEffect(() => { mounted.current = true; return () => { mounted.current = false; request.current?.abort(); request.current = null; }; }, []);
|
|
15
|
+
const start = () => {
|
|
16
|
+
if (!mounted.current || disabled.current || request.current)
|
|
17
|
+
return;
|
|
18
|
+
const controller = new AbortController();
|
|
19
|
+
let accepting = true;
|
|
20
|
+
request.current = controller;
|
|
21
|
+
latest.current = null;
|
|
22
|
+
setObservation(null);
|
|
23
|
+
setCancelled(false);
|
|
24
|
+
setCancelRequested(false);
|
|
25
|
+
void action.run("transfer", async () => {
|
|
26
|
+
try {
|
|
27
|
+
await props.onTransfer({ signal: controller.signal, report: next => {
|
|
28
|
+
if (!accepting || !mounted.current || request.current !== controller || controller.signal.aborted)
|
|
29
|
+
return;
|
|
30
|
+
const value = resolveTransferObservation(next, latest.current);
|
|
31
|
+
latest.current = value;
|
|
32
|
+
setObservation(value);
|
|
33
|
+
} });
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
if (mounted.current && request.current === controller && isConfirmedTransferAbort(error, controller.signal))
|
|
37
|
+
setCancelled(true);
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
accepting = false;
|
|
42
|
+
}
|
|
43
|
+
}).then(() => { if (request.current === controller)
|
|
44
|
+
request.current = null; });
|
|
45
|
+
};
|
|
46
|
+
const cancel = () => { if (mounted.current && !disabled.current && request.current && !request.current.signal.aborted) {
|
|
47
|
+
setCancelRequested(true);
|
|
48
|
+
request.current.abort();
|
|
49
|
+
} };
|
|
50
|
+
const phase = action.session.getSnapshot().status;
|
|
51
|
+
const status = action.pending ? cancelRequested ? props.labels.cancelling : observation ? props.labels.transferring : props.labels.queued
|
|
52
|
+
: cancelled ? props.labels.cancelled : phase === "success" ? props.labels.success : action.failed ? props.labels.error : null;
|
|
53
|
+
const known = observation !== null && observation.total !== null;
|
|
54
|
+
return _jsxs(Stack, { gap: "md", children: [_jsxs(Stack, { axis: "inline", gap: "sm", wrap: true, children: [_jsx(Button, { loading: action.pending, disabled: props.disabled === true, onPress: start, children: props.labels.start }), action.pending ? _jsx(Button, { tone: "secondary", disabled: props.disabled === true || cancelRequested, onPress: cancel, children: props.labels.cancel }) : null] }), action.pending || known ? _jsx(Progress, { label: status ?? props.labels.transferring, ...(known ? { value: observation.completed, max: observation.total } : {}), ...(observation ? { valueText: props.formatProgress(observation) } : {}) }) : null, observation && !action.pending && !known ? _jsx(Text, { variant: "caption", children: props.formatProgress(observation) }) : null, status && !action.pending ? _jsx(Text, { accessibilityRole: action.failed && !cancelled ? "alert" : "text", accessibilityLiveRegion: "polite", align: "center", tone: action.failed && !cancelled ? "danger" : "primary", children: status }) : null] });
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=transfer-task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer-task.js","sourceRoot":"","sources":["../src/transfer-task.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hjmds/react-native",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.21.0",
|
|
4
4
|
"description": "Expo-independent React Native renderers for HJM design contracts.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
@@ -418,6 +418,18 @@
|
|
|
418
418
|
"import": "./dist/activity-heatmap.js",
|
|
419
419
|
"default": "./dist/activity-heatmap.js"
|
|
420
420
|
},
|
|
421
|
+
"./chart": {
|
|
422
|
+
"types": "./dist/chart.d.ts",
|
|
423
|
+
"react-native": "./dist/chart.js",
|
|
424
|
+
"import": "./dist/chart.js",
|
|
425
|
+
"default": "./dist/chart.js"
|
|
426
|
+
},
|
|
427
|
+
"./data-table": {
|
|
428
|
+
"types": "./dist/data-table.d.ts",
|
|
429
|
+
"react-native": "./dist/data-table.js",
|
|
430
|
+
"import": "./dist/data-table.js",
|
|
431
|
+
"default": "./dist/data-table.js"
|
|
432
|
+
},
|
|
421
433
|
"./statistic-motion": {
|
|
422
434
|
"types": "./dist/statistic-motion.d.ts",
|
|
423
435
|
"react-native": "./dist/statistic-motion.js",
|
|
@@ -531,6 +543,66 @@
|
|
|
531
543
|
"react-native": "./dist/activity-chip.js",
|
|
532
544
|
"import": "./dist/activity-chip.js",
|
|
533
545
|
"default": "./dist/activity-chip.js"
|
|
546
|
+
},
|
|
547
|
+
"./collection-editing": {
|
|
548
|
+
"types": "./dist/collection-editing.d.ts",
|
|
549
|
+
"react-native": "./dist/collection-editing.js",
|
|
550
|
+
"import": "./dist/collection-editing.js",
|
|
551
|
+
"default": "./dist/collection-editing.js"
|
|
552
|
+
},
|
|
553
|
+
"./data-workflows": {
|
|
554
|
+
"types": "./dist/data-workflows.d.ts",
|
|
555
|
+
"react-native": "./dist/data-workflows.js",
|
|
556
|
+
"import": "./dist/data-workflows.js",
|
|
557
|
+
"default": "./dist/data-workflows.js"
|
|
558
|
+
},
|
|
559
|
+
"./task-controls": {
|
|
560
|
+
"types": "./dist/task-controls.d.ts",
|
|
561
|
+
"react-native": "./dist/task-controls.js",
|
|
562
|
+
"import": "./dist/task-controls.js",
|
|
563
|
+
"default": "./dist/task-controls.js"
|
|
564
|
+
},
|
|
565
|
+
"./media-transport": {
|
|
566
|
+
"types": "./dist/media-transport.d.ts",
|
|
567
|
+
"react-native": "./dist/media-transport.js",
|
|
568
|
+
"import": "./dist/media-transport.js",
|
|
569
|
+
"default": "./dist/media-transport.js"
|
|
570
|
+
},
|
|
571
|
+
"./transfer-task": {
|
|
572
|
+
"types": "./dist/transfer-task.d.ts",
|
|
573
|
+
"react-native": "./dist/transfer-task.js",
|
|
574
|
+
"import": "./dist/transfer-task.js",
|
|
575
|
+
"default": "./dist/transfer-task.js"
|
|
576
|
+
},
|
|
577
|
+
"./authoring-tools": {
|
|
578
|
+
"types": "./dist/authoring-tools.d.ts",
|
|
579
|
+
"react-native": "./dist/authoring-tools.js",
|
|
580
|
+
"import": "./dist/authoring-tools.js",
|
|
581
|
+
"default": "./dist/authoring-tools.js"
|
|
582
|
+
},
|
|
583
|
+
"./social-compositions": {
|
|
584
|
+
"types": "./dist/social-compositions.d.ts",
|
|
585
|
+
"react-native": "./dist/social-compositions.js",
|
|
586
|
+
"import": "./dist/social-compositions.js",
|
|
587
|
+
"default": "./dist/social-compositions.js"
|
|
588
|
+
},
|
|
589
|
+
"./communication": {
|
|
590
|
+
"types": "./dist/communication.d.ts",
|
|
591
|
+
"react-native": "./dist/communication.js",
|
|
592
|
+
"import": "./dist/communication.js",
|
|
593
|
+
"default": "./dist/communication.js"
|
|
594
|
+
},
|
|
595
|
+
"./toggle-feedback": {
|
|
596
|
+
"types": "./dist/toggle-feedback.d.ts",
|
|
597
|
+
"react-native": "./dist/toggle-feedback.js",
|
|
598
|
+
"import": "./dist/toggle-feedback.js",
|
|
599
|
+
"default": "./dist/toggle-feedback.js"
|
|
600
|
+
},
|
|
601
|
+
"./streaming-answer": {
|
|
602
|
+
"types": "./dist/streaming-answer.d.ts",
|
|
603
|
+
"react-native": "./dist/streaming-answer.js",
|
|
604
|
+
"import": "./dist/streaming-answer.js",
|
|
605
|
+
"default": "./dist/streaming-answer.js"
|
|
534
606
|
}
|
|
535
607
|
},
|
|
536
608
|
"files": [
|
|
@@ -542,7 +614,7 @@
|
|
|
542
614
|
],
|
|
543
615
|
"peerDependencies": {
|
|
544
616
|
"@gorhom/bottom-sheet": "5.2.14",
|
|
545
|
-
"@hjmds/design-contracts": ">=1.
|
|
617
|
+
"@hjmds/design-contracts": ">=1.21.0 <1.22.0",
|
|
546
618
|
"@react-native-menu/menu": "1.2.2",
|
|
547
619
|
"@shopify/react-native-skia": "^2.6.2",
|
|
548
620
|
"react": ">=19",
|
|
@@ -601,7 +673,7 @@
|
|
|
601
673
|
"blobatar": "2.7.0",
|
|
602
674
|
"@blobatar/react-native": "2.7.0",
|
|
603
675
|
"lucide-react-native": "1.49.0",
|
|
604
|
-
"@hjmds/design-contracts": "1.
|
|
676
|
+
"@hjmds/design-contracts": "1.21.0"
|
|
605
677
|
},
|
|
606
678
|
"engines": {
|
|
607
679
|
"node": ">=20"
|