* Copyright (c) 2023-2025 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
if (!('finalizeConstruction' in ViewPU.prototype)) {
Reflect.set(ViewPU.prototype, 'finalizeConstruction', () => {
});
}
const curves = requireNativeModule('ohos.curves');
const hilog = requireNapi('hilog');
const LengthMetrics = requireNapi('arkui.node').LengthMetrics;
const i18n = requireNapi('i18n');
const i14 = 250;
const j14 = 200;
const k14 = 12;
const l14 = 9;
const n14 = 24;
const o14 = 2;
const p14 = 1;
const q14 = 1;
export var MarginType;
(function (MarginType) {
MarginType[MarginType['DEFAULT_MARGIN'] = 0] = 'DEFAULT_MARGIN';
MarginType[MarginType['FIT_MARGIN'] = 1] = 'FIT_MARGIN';
})(MarginType || (MarginType = {}));
export class ExceptionPrompt extends ViewPU {
constructor(parent, params, __localStorage, elmtId = -1, paramsLambda = undefined, extraInfo) {
super(parent, __localStorage, elmtId, extraInfo);
if (typeof paramsLambda === 'function') {
this.paramsGenerator_ = paramsLambda;
}
this.__options = new SynchedPropertyObjectOneWayPU(params.options, this, 'options');
this.__fontSizeScale = new ObservedPropertyObjectPU(undefined, this, 'fontSizeScale');
this.touchBackgroundColor = {
'id': -1,
'type': 10001,
params: ['sys.color.ohos_id_color_sub_background_transparent'],
'bundleName': '__harDefaultBundleName__',
'moduleName': '__harDefaultModuleName__'
};
this.maxAppFontScale = 1;
this.isFollowingSystemFontScale = false;
this.onTipClick = undefined;
this.onActionTextClick = undefined;
this.callbackId = undefined;
this.callbacks = {
onConfigurationUpdated: (config) => {
this.fontSizeScale = Math.min(this.updateFontScale(), o14);
this.fontSizeScale = Math.max(this.fontSizeScale, p14);
},
onMemoryLevel() {
}
};
this.setInitiallyProvidedValue(params);
this.finalizeConstruction();
}
setInitiallyProvidedValue(params) {
if (params.fontSizeScale !== undefined) {
this.fontSizeScale = params.fontSizeScale;
}
if (params.touchBackgroundColor !== undefined) {
this.touchBackgroundColor = params.touchBackgroundColor;
}
if (params.maxAppFontScale !== undefined) {
this.maxAppFontScale = params.maxAppFontScale;
}
if (params.isFollowingSystemFontScale !== undefined) {
this.isFollowingSystemFontScale = params.isFollowingSystemFontScale;
}
if (params.onTipClick !== undefined) {
this.onTipClick = params.onTipClick;
}
if (params.onActionTextClick !== undefined) {
this.onActionTextClick = params.onActionTextClick;
}
if (params.callbackId !== undefined) {
this.callbackId = params.callbackId;
}
if (params.callbacks !== undefined) {
this.callbacks = params.callbacks;
}
}
updateStateVars(params) {
this.__options.reset(params.options);
}
purgeVariableDependenciesOnElmtId(rmElmtId) {
this.__options.purgeDependencyOnElmtId(rmElmtId);
this.__fontSizeScale.purgeDependencyOnElmtId(rmElmtId);
}
aboutToBeDeleted() {
this.__options.aboutToBeDeleted();
this.__fontSizeScale.aboutToBeDeleted();
SubscriberManager.Get().delete(this.id__());
this.aboutToBeDeletedInternal();
}
get options() {
return this.__options.get();
}
set options(newValue) {
this.__options.set(newValue);
}
get fontSizeScale() {
return this.__fontSizeScale.get();
}
set fontSizeScale(newValue) {
this.__fontSizeScale.set(newValue);
}
TextBuilder(parent = null) {
this.observeComponentCreation2((elmtId, isInitialRender) => {
Flex.create({ justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center });
Flex.padding({
left: {
'id': -1,
'type': 10002,
params: ['sys.float.ohos_id_notification_margin_start'],
'bundleName': '__harDefaultBundleName__',
'moduleName': '__harDefaultModuleName__'
},
right: {
'id': -1,
'type': 10002,
params: ['sys.float.ohos_id_text_paragraph_margin_s'],
'bundleName': '__harDefaultBundleName__',
'moduleName': '__harDefaultModuleName__'
},
top: {
'id': -1,
'type': 10002,
params: ['sys.float.ohos_id_default_padding_start'],
'bundleName': '__harDefaultBundleName__',
'moduleName': '__harDefaultModuleName__'
},
bottom: {
'id': -1,
'type': 10002,
params: ['sys.float.ohos_id_default_padding_end'],
'bundleName': '__harDefaultBundleName__',
'moduleName': '__harDefaultModuleName__'
}
});
}, Flex);
this.observeComponentCreation2((elmtId, isInitialRender) => {
Row.create();
Row.padding({
right: {
'id': -1,
'type': 10002,
params: ['sys.float.ohos_id_default_padding_end'],
'bundleName': '__harDefaultBundleName__',
'moduleName': '__harDefaultModuleName__'
}
});
Row.width('100%');
Row.accessibilityDescription(this.onTipClick ? '' : ' ');
Row.onClick(() => {
this.onTipClick && this.onTipClick();
});
}, Row);
this.observeComponentCreation2((elmtId, isInitialRender) => {
If.create();
if (this.options?.symbolStyle !== undefined) {
this.ifElseBranchUpdateFunction(0, () => {
this.observeComponentCreation2((elmtId, isInitialRender) => {
SymbolGlyph.create();
SymbolGlyph.fontColor([{
'id': -1,
'type': 10001,
params: ['sys.color.ohos_id_color_warning'],
'bundleName': '__harDefaultBundleName__',
'moduleName': '__harDefaultModuleName__'
}]);
SymbolGlyph.attributeModifier.bind(this)(this.options?.symbolStyle);
SymbolGlyph.effectStrategy(SymbolEffectStrategy.NONE);
SymbolGlyph.symbolEffect(new SymbolEffect(), false);
SymbolGlyph.fontSize(`${(this.fontSizeScale ?? q14) * n14}vp`);
}, SymbolGlyph);
});
} else {
this.ifElseBranchUpdateFunction(1, () => {
this.observeComponentCreation2((elmtId, isInitialRender) => {
If.create();
if (Util.v14(this.options?.icon)) {
this.ifElseBranchUpdateFunction(0, () => {
this.observeComponentCreation2((elmtId, isInitialRender) => {
SymbolGlyph.create(this.options?.icon ?? {
'id': -1,
'type': 40000,
params: ['sys.symbol.exclamationmark_circle'],
'bundleName': '__harDefaultBundleName__',
'moduleName': '__harDefaultModuleName__'
});
SymbolGlyph.fontColor([{
'id': -1,
'type': 10001,
params: ['sys.color.ohos_id_color_warning'],
'bundleName': '__harDefaultBundleName__',
'moduleName': '__harDefaultModuleName__'
}]);
SymbolGlyph.fontSize(`${(this.fontSizeScale ?? q14) * n14}vp`);
}, SymbolGlyph);
});
} else {
this.ifElseBranchUpdateFunction(1, () => {
this.observeComponentCreation2((elmtId, isInitialRender) => {
Image.create(this.options?.icon);
Image.width('24vp');
Image.height('24vp');
Image.fillColor({
'id': -1,
'type': 10001,
params: ['sys.color.ohos_id_color_warning'],
'bundleName': '__harDefaultBundleName__',
'moduleName': '__harDefaultModuleName__'
});
}, Image);
});
}
}, If);
If.pop();
});
}
}, If);
If.pop();
this.observeComponentCreation2((elmtId, isInitialRender) => {
Text.create(this.options.tip);
Text.fontSize({
'id': -1,
'type': 10002,
params: ['sys.float.ohos_id_text_size_body1'],
'bundleName': '__harDefaultBundleName__',
'moduleName': '__harDefaultModuleName__'
});
Text.minFontScale(1);
Text.maxFontScale(Math.min(this.updateFontScale(), 2));
Text.fontColor({
'id': -1,
'type': 10001,
params: ['sys.color.ohos_id_color_warning'],
'bundleName': '__harDefaultBundleName__',
'moduleName': '__harDefaultModuleName__'
});
Text.textOverflow({ overflow: TextOverflow.Ellipsis });
Text.maxLines(2);
Text.margin({
start: LengthMetrics.resource({
'id': -1,
'type': 10002,
params: ['sys.float.ohos_id_dialog_margin_end'],
'bundleName': '__harDefaultBundleName__',
'moduleName': '__harDefaultModuleName__'
})
});
Text.flexShrink(1);
Text.direction(i18n.isRTL(i18n.System.getSystemLanguage()) ? Direction.Rtl : Direction.Ltr);
}, Text);
Text.pop();
Row.pop();
this.observeComponentCreation2((elmtId, isInitialRender) => {
If.create();
if (this.options.actionText) {
this.ifElseBranchUpdateFunction(0, () => {
this.observeComponentCreation2((elmtId, isInitialRender) => {
Button.createWithChild({ stateEffect: false, type: ButtonType.Normal });
Button.backgroundColor(this.touchBackgroundColor);
Button.width(this.options.actionText ? 144 : 0);
Button.borderRadius({
'id': -1,
'type': 10002,
params: ['sys.float.ohos_id_corner_radius_subtab'],
'bundleName': '__harDefaultBundleName__',
'moduleName': '__harDefaultModuleName__'
});
Button.padding({
right: {
'id': -1,
'type': 10002,
params: ['sys.float.padding_level2'],
'bundleName': '__harDefaultBundleName__',
'moduleName': '__harDefaultModuleName__'
},
});
Button.accessibilityDescription(this.onActionTextClick ? '' : ' ');
Button.accessibilityRole(this.onActionTextClick ? AccessibilityRoleType.BUTTON :
AccessibilityRoleType.ROLE_NONE);
Button.onClick(() => {
this.onActionTextClick && this.onActionTextClick();
});
}, Button);
this.observeComponentCreation2((elmtId, isInitialRender) => {
Row.create();
Row.width('100%');
Row.justifyContent(FlexAlign.End);
}, Row);
this.observeComponentCreation2((elmtId, isInitialRender) => {
Text.create(this.options.actionText);
Text.fontSize({
'id': -1,
'type': 10002,
params: ['sys.float.ohos_id_text_size_body2'],
'bundleName': '__harDefaultBundleName__',
'moduleName': '__harDefaultModuleName__'
});
Text.minFontScale(1);
Text.maxFontScale(Math.min(this.updateFontScale(), 2));
Text.fontColor({
'id': -1,
'type': 10001,
params: ['sys.color.ohos_id_color_text_secondary'],
'bundleName': '__harDefaultBundleName__',
'moduleName': '__harDefaultModuleName__'
});
Text.maxLines(2);
Text.padding(0);
Text.margin({
end: LengthMetrics.resource({
'id': -1,
'type': 10002,
params: ['sys.float.ohos_id_text_paragraph_margin_s'],
'bundleName': '__harDefaultBundleName__',
'moduleName': '__harDefaultModuleName__'
})
});
Text.textOverflow({ overflow: TextOverflow.Ellipsis });
Text.flexShrink(1);
Text.textAlign(TextAlign.End);
Text.direction(i18n.isRTL(i18n.System.getSystemLanguage()) ? Direction.Rtl : Direction.Ltr);
}, Text);
Text.pop();
this.observeComponentCreation2((elmtId, isInitialRender) => {
SymbolGlyph.create({
'id': -1,
'type': 40000,
params: ['sys.symbol.chevron_right'],
'bundleName': '__harDefaultBundleName__',
'moduleName': '__harDefaultModuleName__'
});
SymbolGlyph.fontSize(`${(this.fontSizeScale ?? q14) * n14}vp`);
SymbolGlyph.fontColor([{
'id': -1,
'type': 10001,
params: ['sys.color.ohos_id_color_tertiary'],
'bundleName': '__harDefaultBundleName__',
'moduleName': '__harDefaultModuleName__'
}]);
}, SymbolGlyph);
Row.pop();
Button.pop();
});
} else {
this.ifElseBranchUpdateFunction(1, () => {
});
}
}, If);
If.pop();
Flex.pop();
}
initialRender() {
this.observeComponentCreation2((elmtId, isInitialRender) => {
Row.create();
Row.width('100%');
Row.position({ y: this.options.marginTop });
Row.zIndex(l14);
}, Row);
this.observeComponentCreation2((elmtId, isInitialRender) => {
Column.create();
Column.padding(this.options.marginType === MarginType.DEFAULT_MARGIN ? {
left: {
'id': -1,
'type': 10002,
params: ['sys.float.ohos_id_card_margin_start'],
'bundleName': '__harDefaultBundleName__',
'moduleName': '__harDefaultModuleName__'
},
right: {
'id': -1,
'type': 10002,
params: ['sys.float.ohos_id_card_margin_end'],
'bundleName': '__harDefaultBundleName__',
'moduleName': '__harDefaultModuleName__'
}
} : {
left: {
'id': -1,
'type': 10002,
params: ['sys.float.ohos_id_max_padding_start'],
'bundleName': '__harDefaultBundleName__',
'moduleName': '__harDefaultModuleName__'
},
right: {
'id': -1,
'type': 10002,
params: ['sys.float.ohos_id_max_padding_end'],
'bundleName': '__harDefaultBundleName__',
'moduleName': '__harDefaultModuleName__'
}
});
Column.transition(TransitionEffect.OPACITY.animation({
curve: curves.cubicBezierCurve(0.33, 0, 0.67, 1),
duration: this.options.isShown ? i14 : j14
}));
Column.visibility(this.options.isShown ? Visibility.Visible : Visibility.None);
}, Column);
this.observeComponentCreation2((elmtId, isInitialRender) => {
Column.create();
Column.width('100%');
Column.borderRadius(k14);
Column.backgroundColor({
'id': -1,
'type': 10001,
params: ['sys.color.comp_background_warning_secondary'],
'bundleName': '__harDefaultBundleName__',
'moduleName': '__harDefaultModuleName__'
});
Column.zIndex(l14);
}, Column);
this.TextBuilder.bind(this)();
Column.pop();
Column.pop();
Row.pop();
}
aboutToAppear() {
try {
let u14 = this.getUIContext();
this.isFollowingSystemFontScale = u14.isFollowingSystemFontScale();
this.maxAppFontScale = u14.getMaxFontScale();
this.fontSizeScale = Math.min(this.updateFontScale(), o14);
this.fontSizeScale = Math.max(this.fontSizeScale, p14);
this.callbackId = u14.getHostContext()?.getApplicationContext()?.on('environment', this.callbacks);
} catch (err) {
let code = err.code;
let message = err.message;
hilog.error(0x3900, 'Ace', `Failed to init fontsizescale info, cause, code: ${code}, message: ${message}`);
}
}
aboutToDisappear() {
if (this.callbackId) {
this.getUIContext().getHostContext()?.getApplicationContext()?.off('environment', this.callbackId);
this.callbackId = void (0);
}
}
updateFontScale() {
let s14 = this.getUIContext();
let t14 = s14.getHostContext()?.config?.fontSizeScale ?? 1;
if (!this.isFollowingSystemFontScale) {
return 1;
}
return Math.min(t14, this.maxAppFontScale);
}
rerender() {
this.updateDirtyElements();
}
}
class Util {
static v14(r14) {
if (r14 === undefined) {
return true;
}
if (!Util.w14(r14)) {
return false;
}
let resource = r14;
return resource.type === Util.x14;
}
static w14(resource) {
if (!resource) {
return false;
}
return typeof resource !== 'string';
}
}
Util.x14 = 40000;
export default {
MarginType,
ExceptionPrompt
}