HarmonyOSBaseLibs/src/main/ets/utils/ToolsHelper.ets
2024-10-12 18:45:02 +08:00

237 行
6.0 KiB
Plaintext

import promptAction from '@ohos.promptAction';
import { BusinessError, deviceInfo } from '@kit.BasicServicesKit';
import { HashMap, util } from '@kit.ArkTS';
import { DeviceInfo } from '../bean/DeviceInfo';
export interface Btn {
text?: string | Resource;
color?: string | Resource;
onClick: () => void
}
export interface AlertOptions {
title?: string
msg?: string
action: Btn
}
export interface ConfirmOptions {
title?: string
msg?: string
confirm: Btn
cancel: Btn
}
export interface ListOptions<T> {
title?: string
cancel?: Btn
values: Array<T>
onSelected: (index: number, value: T) => void
onError?: (msg: string) => void
}
interface ListItem {
content: string
}
@Builder
function customDialogBuilder<T>(option: ListOptions<T>, dialogId: number) {
Column() {
Text(option.title)
.fontSize(13)
.textAlign(TextAlign.Center)
.width('60%')
.maxLines(2)
.ellipsisMode(EllipsisMode.END)
.textOverflow({
overflow: TextOverflow.Ellipsis
})
.visibility(option.title ? Visibility.Visible : Visibility.None)
List({ space: 20, initialIndex: 0 }) {
ForEach(option.values, (item: T, index: number) => {
ListItem() {
Text(typeof item === "string" ? item : (item as ListItem).content)
.width('100%')
.fontSize(16)
.textAlign(TextAlign.Center)
.onClick(() => {
if (ToolsHelper.mapDialog.get(dialogId)) {
promptAction.closeCustomDialog(ToolsHelper.mapDialog.get(dialogId))
ToolsHelper.mapDialog.remove(dialogId)
}
option.onSelected(index, item)
})
}
}, (item: string) => item)
}
.listDirection(Axis.Vertical) // 排列方向
.scrollBar(BarState.Off)
.friction(0.6)
.divider({
strokeWidth: 1,
color: 0xEEEEEE,
startMargin: 20,
endMargin: 20
}) // 每行之间的分界线
.edgeEffect(EdgeEffect.Spring) // 边缘效果设置为Spring
.width('100%')
.height(option.values.length < 8 ? `${option.values.length / 16 * 100}%` : '50%')
.margin({ top: 20 })
}
.padding({
top: 20,
bottom: 20,
left: 20,
right: 20
})
}
/**
* 常用方法
*/
export class ToolsHelper {
/**
* 弹出Toast
* @param msg
*/
static showMessage(msg: string) {
console.info(msg);
promptAction.showToast({
message: msg,
duration: 1500
});
}
/**kio9
* 弹出Alert弹窗
* @param options
*/
static showAlertDialog(options: AlertOptions) {
try {
promptAction.showDialog({
alignment: 1,
title: options.title,
message: options.msg,
buttons: [{
text: options.action.text ?? "确定",
color: options.action.color ?? "#000000",
}]
})
.then(() => {
options.action.onClick()
})
.catch((err: Error) => {
ToolsHelper.showMessage(err.message)
})
} catch (error) {
let message = (error as BusinessError).message
ToolsHelper.showMessage(message)
}
}
/**
* 弹出Confirm弹窗
* @param options
*/
static showConfirmDialog(options: ConfirmOptions) {
try {
promptAction.showDialog({
alignment: 1,
title: options.title,
message: options.msg,
buttons: [{
text: options.confirm.text ?? "确定",
color: options.confirm.color ?? "#000000",
}, {
text: options.cancel.text ?? "取消",
color: options.cancel.color ?? "#666666",
}]
})
.then((data) => {
if (data.index === 0) {
options.confirm.onClick()
} else {
options.cancel.onClick()
}
})
.catch((err: Error) => {
ToolsHelper.showMessage(err.message)
})
} catch (error) {
let message = (error as BusinessError).message
ToolsHelper.showMessage(message)
}
}
public static mapDialog = new HashMap<number, number>()
/**
* 弹出List弹窗
* @param options values 如果是非string列表的话,需要存在content字段
*/
static showListDialog<T = string>(options: ListOptions<T>, p: object) {
let isSuccess: Array<number> = []
options.values.forEach((item, index) => {
if (typeof item !== 'string') {
if (!(item as ListItem).content) {
isSuccess.push(index)
}
}
})
if (isSuccess.length > 0) {
options.onError && options.onError(`第(${isSuccess.join("、")})个数据中,没有content字段。`)
} else {
const dialogTag = new Date().getTime()
promptAction.openCustomDialog({
alignment: 1,
builder: customDialogBuilder.bind(p, options, dialogTag)
}).then((dialogId: number) => {
ToolsHelper.mapDialog.set(dialogTag, dialogId)
})
}
}
/**
* 弹出自定义弹窗
* @param alignment 弹窗在竖直方向上的对齐方式
*/
static showCustomDialog(b: CustomBuilder, alignment?: DialogAlignment) {
const dialogTag = new Date().getTime()
promptAction.openCustomDialog({
alignment: alignment ?? DialogAlignment.Center,
builder: b
}).then((dialogId: number) => {
ToolsHelper.mapDialog.set(dialogTag, dialogId)
}).catch((error: Error) => {
console.log('>>>>>', JSON.stringify(error))
})
}
/**
* 获取调用栈第一个类
*/
static getStackKey() {
let stack = new Error().stack
if (stack) {
let list = JSON.stringify(stack).split('\\n')
let a = list[list.length-2].split(':')[0].split('(')[1]
return a
}
return undefined
}
private static deviceInfo: DeviceInfo
static getDeviceInfo() {
if (!ToolsHelper.deviceInfo) {
ToolsHelper.deviceInfo = new DeviceInfo()
ToolsHelper.deviceInfo.ODID = deviceInfo.ODID
ToolsHelper.deviceInfo.manufacture = deviceInfo.manufacture
ToolsHelper.deviceInfo.brand = deviceInfo.brand
ToolsHelper.deviceInfo.osFullName = deviceInfo.osFullName
}
return ToolsHelper.deviceInfo
}
}