feat(shortcut): ✨ increased mobile compatibility (60%) (#315)
* fix(view): 🐛 修复系统托盘在自动登录时不显示退出问题 优化在其他不需要显示window.$message提示的窗口可禁用 * perf(voice): ⚡ 优化录音组件的样式 * fix(store): 🐛 修复安卓无法获取安全区域问题 * fix(common): 🐛 token 更新bug修复 * feat(mobile): ✨ 新增和优化消息页面布局 * feat(common): ✨ 离线消息同步 * build(system): 📦 修改项目一些样式和图标 修复判断安卓的方法异步问题导致mac release版本页面不加载问题 * build(icon): 📦 更新除了mac系统的图标 * fix(common): 🐛 将数据库迁移 crate 集成到主进程中 * style(common): 💄 修改 tauri 日志配置,输出日志到 logs 目录下;并对日志级别添加颜色; * feat(mobile): ✨ 新增联系人页面 * feat(common): ✨ 引入 tauri-devtools * feat(mobile): ✨ 新增点击加号图标的小弹窗页面 * docs(common): 📝 env文件修改 * fix(router): 🐛 补充提交路由文件,前一次提交缺少更新的路由文件 * fix(common): 🐛 rust 依赖调整;配置调整; * build(config): 📦 修改配置 * fix(common): 🐛 rust .env 文件读取问题修复 * fix(layout): 🐛 修复主页布局漏洞 * build(system): 📦 拉取master的内容 * refactor(view): ♻️ 对接登录参数 * fix(common): 🐛 在线消息保存修复; * fix(common): 🐛 sqlite 保存消息 mark * fix(common): 🐛 消息标记同步问题 * feat(mobile): ✨ 新增通讯录页面内容 * fix(common): 🐛 项目启动之后,还在登录页面时,还会请求房间消息数据等 * fix(common): 🐛 windows启动造成 panic: 去掉 main 的运行时 * fix(common): 🐛 清除缓存,程序卡死 * fix(config): 🐛 更改sqlite configuration配置 修复windows启动控制台打印报错问题 * fix(common): 🐛 修复清除缓存,系统崩溃问题; * fix(common): 🐛 群成员角色判定 bug 修复 * fix(common): 🐛 修复群成员搜索 bug * fix(rust): 🐛 修复字段类型的字节数量 * feat(mobile): ✨ 联系人页面中移植客户端的好友组件 * fix(common): 🐛 修复动态窗口,邮件窗口,AI 插件窗口关闭 bug * fix(common): 🐛 修复会话列表最新消息显示问题 * fix(common): 🐛 左侧功能窗口打开之后,鼠标划上显示问题 * perf(system): ⚡ 适配cloud * perf(centext): ⚡ 优化切换会话时候卡顿问题 修复data.list[0]报错问题 * fix(common): 🐛 重构 Tauri事件的监听器释放逻辑; * refactor(common): ♻️ 重构 Tauri 的事件监听相关代码;增加日志记录; * feat(util): ✨ 新增DOM计算函数,完善社区页面和功能 * refactor(common): ♻️ 重构 useTauriListener * fix(common): 🐛 监听 home 窗口关闭的时候,把 home 窗口隐藏 * perf(ws): ⚡ 移除ws重连次数限制 * fix(common): 🐛 ios 窗口关闭弹窗 bug;修改群屏蔽状态导致消息错乱 bug; * feat(util): ✨ 新增小屏安全区域页面适配,优化多次监听resize导致的性能问题 * fix(common): 🐛 初始化消息发送时的消息状态为发送中 * fix(ios): 🐛 修复rust依赖问题导致ios启动失败 * chore(format): 🔨 使用biome替换eslint * perf(rust): ⚡ 添加超时机制和错误处理优化 优化数据库连接池配置,调整连接参数和日志级别 新增全局超时配置模块 改进 IM 客户端锁机制,避免跨 await 持有锁 增强命令函数错误处理,返回 Result 类型 优化托盘图标创建逻辑,添加默认图标检查 重构应用初始化流程,使用异步任务避免阻塞 * fix(scanner): 🐛 修复存储扫描导致程序崩溃(扫描中关闭未解决) * fix(configuration): 🐛 修复release打包后初始化应用数据失败问题 * perf(rust): ⚡ 优化未处理的unwrap() * fix(hide_notify): 🐛 修复hide_notify事件无限循环导致程序崩溃问题 * fix(voice): 🐛 修复输入框切换录音组件后选择表情包导致错位问题 * fix(view): 🐛 windwos notify和tray导致系统卡死 * fix(style): 🐛 修复样式错乱问题 * fix(common): 🐛 windows 接收消息 打开主窗口卡死 * fix(style): 🐛 修改图标样式 * fix(common): 🐛 windows接收群消息卡死 * build(sqlite): 📦 合并sqlite分支代码 * fix(common): 🐛 mac docker 计数 * fix(common): 🐛 添加macos编译;解决rust警告 * fix(common): 🐛 mac badge 计数 * fix(common): 🐛 修复自动登录问题;修复watch 的异步问题导致的数据竞态问题 * fix(common): 🐛 删除会话功能; * build(ios): 📦 增加移动端所需的配置 * fix(common): 🐛 ios 启动 tauri 插件和命令适配 * fix(common): 🐛 查询消息根据 id 排序时,将 id 转为数值进行排序 * refactor(common): ♻️ 使用 tracing 作为日志框架 * fix(unreadCount): 🐛 修复标记重复问题 * style(lint): 💄 优化了biome的配置 按照新的biome配置格式化代码 * style(biome): 💄 完善biome规则配置 * style(biome): 💄 增加自动移除未使用的导入 * feat(mobile): ✨ 新增“我的”页面内容及动画,修复安全边距问题 * fix(common): 🐛 修改AnnouncementBody类型 * fix(common): 🐛 修改 ApiResult 类型 * feat(mobile): ✨ 新增聊天室页面 * fix(ios): 🐛 添加log依赖 * fix(common): 🐛 去掉 home 窗口的重复监听 * fix(common): 🐛 发送消息接口,用channel 代替 event,解决系统卡死; * fix(common): 🐛 android启动问题 * fix(rust): 🐛 修复ios签名问题 修复ios底部栏不显示问题|移除冗余的权限配置 * refactor(common): ♻️ 将 db.sqlite 设置为resource,通过 tauri api 进行读取 * test(common): ✅ 新增视频通话局部代码 * fix(rust): 🐛 修复移动端无法启动并且无法创建对应文件的问题 * test(common): ✅ 优化通话逻辑 * feat(mobile): ✨ 新增客户端对象,修复加载页载入问题 * chore(common): 🔨 修改 tauri 配置文件 * ci(log): 🎡 修改日志打印的级别和语言都为英文 * feat(mobile): ✨ 新增聊天窗口页面内容 * fix(common): 🐛 notify_cotent事件修改 * feat(mobile): ✨ 新增hula插件 * perf(mobile): ⚡ 优化一些移动端逻辑的判断 * feat(mobile): ✨ 聊天页新增输入法高度适配功能,优化gradle的app构建性能 * feat(mobile): ✨ 新增聊天页面输入框的图标等内容 * feat(common): ✨ 初步实现 webrtc * fix(common): 🐛 发送视频通话请求 * fix(common): 🐛 webrtc实现-待测试 * fix(common): 🐛 webrtc-测试 * build(biome): 📦 升级biome版本 * style(common): 💄 webrtc 页面 ui调整 * build(package): 📦 增加package.json的$schema * build(lint-staged): 📦 更新lint-staged版本 * fix(common): 🐛 rtc 页面头像显示 * fix(common): 🐛 rtc 第一次切换摄像头未显示远程 * fix(common): 🐛 webrtc 挂断 * fix(common): 🐛 rtc 通话结束 * fix(common): 🐛 ws监听挂断消息 * fix(common): 🐛 rtc 设备检查 * fix(common): 🐛 检查audiooutput * fix(common): 🐛 检查音量来判断用户是否开启 audio * fix(common): 🐛 检查音量判断声音设备 * fix(agreement): 🐛 前端对接cloud的刷新token * feat(mobile): ✨ 新增postcss-px-to-viewport库用于转换px变量 * fix(common): 🐛 重构 webrtc * feat(build): ✨ 新增打包命令交互式终端 * fix(common): 🐛 webrtc 异常 * fix(common): 🐛 rtc 异常 * fix(common): 🐛 rtc candidate * fix(common): 🐛 通知窗口 * fix(common): 🐛 rtc 通话时间显示 * fix(common): 🐛 关闭扬声器功能 * fix(common): 🐛 关闭麦克风 * fix(common): 🐛 win 通知窗口显示问题 * fix(common): 🐛 rtc调整设置通知通知栏的高度 * feat(mobile): ✨ 新增AutoFixHeightPage页,用于适配移动端动态高度布局;新增聊天室页面内容 * feat(common): ✨ 新增处理进群审核接口、音视频处理约定逻辑 * fix(common): 🐛 前端刷新 token 之后调用 command 更新 rust 部分的 token * fix(common): 🐛 显示视频通话消息 * fix(common): 🐛 webrtc 语音通话调用 * feat(mobile): ✨ 初步实现聊天室页面列表 * fix(common): 🐛 查询所有会话 bug * build(build): 📦 升级一些依赖版本 * refactor(common): ♻️ rust 重构ws * style(avatar): 💄 优化头像加载失败时候展示的图片 * fix(common): 🐛 rust ws * fix(common): 🐛 修复群聊状态显示、同步后端打电话逻辑 * fix(common): 🐛 查询群成员报错 异步问题 * fix(common): 🐛 群成员 异步问题 * refactor(common): ♻️ rust 异常处理 * fix(common): 🐛 消息 骨架屏 异常 * fix(common): 🐛 删除无用代码 * fix(common): 🐛 win 图标闪烁问题 * fix(common): 🐛 ws 保活 * feat(mobile): ✨ 新增聊天室的聊天列表,修复websocket连接的移动端适配问题 * feat(ChatFooter): ✨ 增加输入框和ChatFooter组件的拖拽效果 优化私聊在线状态 * fix(common): 🐛 webrtc 切换视频关闭远程视频流 * fix(common): 🐛 message mark issue resolve * fix(common): 🐛 message mark issue resolve * refactor(common): ♻️ delete useless code * fix(common): 🐛 save_room_member_batch cause database lock * fix(common): 🐛 show the system messgage of join group * fix(common): 🐛 message sound * feat(mobile): ✨ add group settings page * build(img): 📦 压缩一些图片为webp 修改一下代码的逻辑 * perf(global): ⚡ 优化群成员排序、输入框发送事件为form表单的提交事件 优化chatfooter输入框高度拖拽和home窗口拖拽时性能问题 优化home窗口拖拽会持续触发当前会话选中后对应房间已读触发问题 * chore(lint): 🔨 优化lint的配置 * perf(rtcCall): ⚡ 优化通话窗口的样式和关闭窗口会挂断的功能 * chore(system): 🔨 合并cloud分支 * fix(common): 🐛 ws reconnect in backend reboot * fix(common): 🐛 webrtc relate message show * fix(common): 🐛 ws delete useless code * fix(common): 🐛 resolve ws multi connection * docs(config): 📝 更新群二维码和赞助榜 * fix(mobile): 🐛 fix loading page images and Android startup issue from init.rs builder * fix(common): 🐛 ws setAppBackGroundState * fix(common): 🐛 env config modify * fix(common): 🐛 webrtc on CANCEL * fix(common): 🐛 group announcement update * fix(common): 🐛 announcement issuce * fix(common): 🐛 webrtc windows dragable * feat(mobile): ✨ add notice page * fix(system): 🐛 fix location of call component and some page styles * fix(common): 🐛 webrtc issue * ci(common): 🎡 .env.dev modify * fix(common): 🐛 gET_ROOM_MEMBERS command issue * fix(common): 🐛 update my group info * feat(mobile): ✨ added page for editing group announcements * fix(common): 🐛 webrtc audio call issue * fix(common): 🐛 webrtc video or audio status switch issue * fix(group): 🐛 fixed some logic and restrictions on inviting members into groups Optimize Create Script * style(style): 💄 remove some styles and comments * fix(common): 🐛 fix WebRTC audio cannot be heard * fix(common): 🐛 info import error * fix(common): 🐛 fix #ICT1BO group info update * fix(common): 🐛 fix "不是好友关系" issue * feat(mobile): ✨ add 'Profile' related pages * fix(common): 🐛 add group apply list * feat(mobile): ✨ add page for creating new posts * fix(common): 🐛 webrtc if can't acquire device then hang up * fix(common): 🐛 mute local video ele * fix(common): 🐛 同步最新申请接口 * fix(common): 🐛 change isSpeakerOn and mute the bell * feat(mobile): ✨ add 'My Messages' page * fix(common): 🐛 group apply invite dom * style(style): 💄 change the style of language statistics and incoming call notifications * fix(rtc): 🐛 fix some problems when rtc dialed optimize some styles and icons of rtc window * perf(rtc): ⚡ optimize rtc window display on mac * feat(shortcut): ✨ add global shortcut management functionality Integrated global shortcut plugin to enable customizable keyboard shortcuts * build(biome): 📦 update biome * perf(shortcut): ⚡ optimize shortcut key functions * perf(screenshot): ⚡ optimize screenshot function * perf(style): ⚡ optimize.gitattributes configuration * fix(common): 🐛 handle friend and group invite * fix(screenshot): 🐛 fix drawing not cleared and option group logic issues * fix(common): 🐛 disconnect ws when logout * fix(common): 🐛 group invite api * fix(mac): 🐛 fix screenshot black screen issue on mac * fix(common): 🐛 connect to Qiniu Cloud, use the current room when requesting a session * fix(common): 🐛 src-tauri .env config * fix(mobile): 🐛 fix issue preventing Android from starting properly * fix(config): 🐛 fix some startup and styling issues caused by configuration --------- Co-authored-by: 卡仔 <1271013637@qq.com> Co-authored-by: wanwanruwoxin <254693270@qq.com> Co-authored-by: 乾乾 <1046762075@qq.com>
17
tauri-plugin-hula/.gitignore
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
/.vs
|
||||
.DS_Store
|
||||
.Thumbs.db
|
||||
*.sublime*
|
||||
.idea/
|
||||
debug.log
|
||||
package-lock.json
|
||||
.vscode/settings.json
|
||||
yarn.lock
|
||||
|
||||
/.tauri
|
||||
/target
|
||||
Cargo.lock
|
||||
node_modules/
|
||||
|
||||
dist-js
|
||||
dist
|
||||
17
tauri-plugin-hula/Cargo.toml
Normal file
@@ -0,0 +1,17 @@
|
||||
[package]
|
||||
name = "tauri-plugin-hula"
|
||||
version = "0.1.0"
|
||||
authors = [ "You" ]
|
||||
description = ""
|
||||
edition = "2021"
|
||||
rust-version = "1.77.2"
|
||||
exclude = ["/examples", "/dist-js", "/guest-js", "/node_modules"]
|
||||
links = "tauri-plugin-hula"
|
||||
|
||||
[dependencies]
|
||||
tauri = { version = "2.6.2" }
|
||||
serde = "1.0"
|
||||
thiserror = "2"
|
||||
|
||||
[build-dependencies]
|
||||
tauri-plugin = { version = "2.3.0", features = ["build"] }
|
||||
1
tauri-plugin-hula/README.md
Normal file
@@ -0,0 +1 @@
|
||||
# Tauri Plugin hula
|
||||
2
tauri-plugin-hula/android/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
/build
|
||||
/.tauri
|
||||
BIN
tauri-plugin-hula/android/.gradle/8.9/checksums/checksums.lock
Normal file
BIN
tauri-plugin-hula/android/.gradle/8.9/fileChanges/last-build.bin
Normal file
BIN
tauri-plugin-hula/android/.gradle/8.9/fileHashes/fileHashes.lock
Normal file
0
tauri-plugin-hula/android/.gradle/8.9/gc.properties
Normal file
@@ -0,0 +1,2 @@
|
||||
#Mon Aug 04 13:06:34 CST 2025
|
||||
gradle.version=8.9
|
||||
44
tauri-plugin-hula/android/build.gradle.kts
Normal file
@@ -0,0 +1,44 @@
|
||||
plugins {
|
||||
id("com.android.library")
|
||||
id("org.jetbrains.kotlin.android")
|
||||
}
|
||||
|
||||
android {
|
||||
namespace = "com.plugin.hula"
|
||||
compileSdk = 34
|
||||
|
||||
defaultConfig {
|
||||
minSdk = 21
|
||||
|
||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||
consumerProguardFiles("consumer-rules.pro")
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
isMinifyEnabled = false
|
||||
proguardFiles(
|
||||
getDefaultProguardFile("proguard-android-optimize.txt"),
|
||||
"proguard-rules.pro"
|
||||
)
|
||||
}
|
||||
}
|
||||
compileOptions {
|
||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||
targetCompatibility = JavaVersion.VERSION_1_8
|
||||
}
|
||||
kotlinOptions {
|
||||
jvmTarget = "1.8"
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
|
||||
implementation("androidx.core:core-ktx:1.9.0")
|
||||
implementation("androidx.appcompat:appcompat:1.6.0")
|
||||
implementation("com.google.android.material:material:1.7.0")
|
||||
testImplementation("junit:junit:4.13.2")
|
||||
androidTestImplementation("androidx.test.ext:junit:1.1.5")
|
||||
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
|
||||
implementation(project(":tauri-android"))
|
||||
}
|
||||
21
tauri-plugin-hula/android/proguard-rules.pro
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
# Add project specific ProGuard rules here.
|
||||
# You can control the set of applied configuration files using the
|
||||
# proguardFiles setting in build.gradle.
|
||||
#
|
||||
# For more details, see
|
||||
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||
|
||||
# If your project uses WebView with JS, uncomment the following
|
||||
# and specify the fully qualified class name to the JavaScript interface
|
||||
# class:
|
||||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||
# public *;
|
||||
#}
|
||||
|
||||
# Uncomment this to preserve the line number information for
|
||||
# debugging stack traces.
|
||||
#-keepattributes SourceFile,LineNumberTable
|
||||
|
||||
# If you keep the line number information, uncomment this to
|
||||
# hide the original source file name.
|
||||
#-renamesourcefileattribute SourceFile
|
||||
31
tauri-plugin-hula/android/settings.gradle
Normal file
@@ -0,0 +1,31 @@
|
||||
pluginManagement {
|
||||
repositories {
|
||||
mavenCentral()
|
||||
gradlePluginPortal()
|
||||
google()
|
||||
}
|
||||
resolutionStrategy {
|
||||
eachPlugin {
|
||||
switch (requested.id.id) {
|
||||
case "com.android.library":
|
||||
useVersion("8.0.2")
|
||||
break
|
||||
case "org.jetbrains.kotlin.android":
|
||||
useVersion("1.8.20")
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dependencyResolutionManagement {
|
||||
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
|
||||
repositories {
|
||||
mavenCentral()
|
||||
google()
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
include ':tauri-android'
|
||||
project(':tauri-android').projectDir = new File('./.tauri/tauri-api')
|
||||
24
tauri-plugin-hula/android/src/androidTest/java/ExampleInstrumentedTest.kt
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
package com.plugin.hula
|
||||
|
||||
import androidx.test.platform.app.InstrumentationRegistry
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
|
||||
import org.junit.Assert.*
|
||||
|
||||
/**
|
||||
* Instrumented test, which will execute on an Android device.
|
||||
*
|
||||
* See [testing documentation](http://d.android.com/tools/testing).
|
||||
*/
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class ExampleInstrumentedTest {
|
||||
@Test
|
||||
fun useAppContext() {
|
||||
// Context of the app under test.
|
||||
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
|
||||
assertEquals("com.plugin.hula", appContext.packageName)
|
||||
}
|
||||
}
|
||||
3
tauri-plugin-hula/android/src/main/AndroidManifest.xml
Normal file
@@ -0,0 +1,3 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
</manifest>
|
||||
10
tauri-plugin-hula/android/src/main/java/Example.kt
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
package com.plugin.hula
|
||||
|
||||
import android.util.Log
|
||||
|
||||
class Example {
|
||||
fun pong(value: String): String {
|
||||
Log.i("Pong", value)
|
||||
return value
|
||||
}
|
||||
}
|
||||
28
tauri-plugin-hula/android/src/main/java/ExamplePlugin.kt
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
package com.plugin.hula
|
||||
|
||||
import android.app.Activity
|
||||
import app.tauri.annotation.Command
|
||||
import app.tauri.annotation.InvokeArg
|
||||
import app.tauri.annotation.TauriPlugin
|
||||
import app.tauri.plugin.JSObject
|
||||
import app.tauri.plugin.Plugin
|
||||
import app.tauri.plugin.Invoke
|
||||
|
||||
@InvokeArg
|
||||
class PingArgs {
|
||||
var value: String? = null
|
||||
}
|
||||
|
||||
@TauriPlugin
|
||||
class ExamplePlugin(private val activity: Activity): Plugin(activity) {
|
||||
private val implementation = Example()
|
||||
|
||||
@Command
|
||||
fun ping(invoke: Invoke) {
|
||||
val args = invoke.parseArgs(PingArgs::class.java)
|
||||
|
||||
val ret = JSObject()
|
||||
ret.put("value", implementation.pong(args.value ?: "default value :("))
|
||||
invoke.resolve(ret)
|
||||
}
|
||||
}
|
||||
17
tauri-plugin-hula/android/src/test/java/ExampleUnitTest.kt
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
package com.plugin.hula
|
||||
|
||||
import org.junit.Test
|
||||
|
||||
import org.junit.Assert.*
|
||||
|
||||
/**
|
||||
* Example local unit test, which will execute on the development machine (host).
|
||||
*
|
||||
* See [testing documentation](http://d.android.com/tools/testing).
|
||||
*/
|
||||
class ExampleUnitTest {
|
||||
@Test
|
||||
fun addition_isCorrect() {
|
||||
assertEquals(4, 2 + 2)
|
||||
}
|
||||
}
|
||||
8
tauri-plugin-hula/build.rs
Normal file
@@ -0,0 +1,8 @@
|
||||
const COMMANDS: &[&str] = &["ping"];
|
||||
|
||||
fn main() {
|
||||
tauri_plugin::Builder::new(COMMANDS)
|
||||
.android_path("android")
|
||||
.ios_path("ios")
|
||||
.build();
|
||||
}
|
||||
24
tauri-plugin-hula/examples/tauri-app/.gitignore
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
node_modules
|
||||
dist
|
||||
dist-ssr
|
||||
*.local
|
||||
|
||||
# Editor directories and files
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
.idea
|
||||
.DS_Store
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
3
tauri-plugin-hula/examples/tauri-app/.vscode/extensions.json
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"recommendations": ["svelte.svelte-vscode", "tauri-apps.tauri-vscode", "rust-lang.rust-analyzer"]
|
||||
}
|
||||
8
tauri-plugin-hula/examples/tauri-app/README.md
Normal file
@@ -0,0 +1,8 @@
|
||||
# Svelte + Vite
|
||||
|
||||
This template should help get you started developing with Tauri and Svelte in Vite.
|
||||
|
||||
## Recommended IDE Setup
|
||||
|
||||
[VS Code](https://code.visualstudio.com/) + [Svelte](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode) + [Tauri](https://marketplace.visualstudio.com/items?itemName=tauri-apps.tauri-vscode) + [rust-analyzer](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer).
|
||||
|
||||
14
tauri-plugin-hula/examples/tauri-app/index.html
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Tauri + Svelte</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
<script type="module" src="/src/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
34
tauri-plugin-hula/examples/tauri-app/jsconfig.json
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"moduleResolution": "Node",
|
||||
"target": "ESNext",
|
||||
"module": "ESNext",
|
||||
/**
|
||||
* svelte-preprocess cannot figure out whether you have
|
||||
* a value or a type, so tell TypeScript to enforce using
|
||||
* `import type` instead of `import` for Types.
|
||||
*/
|
||||
"importsNotUsedAsValues": "error",
|
||||
"isolatedModules": true,
|
||||
"resolveJsonModule": true,
|
||||
/**
|
||||
* To have warnings / errors of the Svelte compiler at the
|
||||
* correct position, enable source maps by default.
|
||||
*/
|
||||
"sourceMap": true,
|
||||
"esModuleInterop": true,
|
||||
"skipLibCheck": true,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"baseUrl": ".",
|
||||
/**
|
||||
* Typecheck JS in `.svelte` and `.js` files by default.
|
||||
* Disable this if you'd like to use dynamic types.
|
||||
*/
|
||||
"checkJs": true
|
||||
},
|
||||
/**
|
||||
* Use global.d.ts instead of compilerOptions.types
|
||||
* to avoid limiting type declarations.
|
||||
*/
|
||||
"include": ["src/**/*.d.ts", "src/**/*.js", "src/**/*.svelte"]
|
||||
}
|
||||
22
tauri-plugin-hula/examples/tauri-app/package.json
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"name": "tauri-app",
|
||||
"private": true,
|
||||
"version": "0.1.0",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "vite build",
|
||||
"preview": "vite preview",
|
||||
"tauri": "tauri"
|
||||
},
|
||||
"dependencies": {
|
||||
"@tauri-apps/api": "^2.0.0",
|
||||
"tauri-plugin-hula-api": "file:../../"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@sveltejs/vite-plugin-svelte": "^5.0.0",
|
||||
"svelte": "^5.0.0",
|
||||
"vite": "^6.0.0",
|
||||
"@tauri-apps/cli": "^2.0.0"
|
||||
}
|
||||
}
|
||||
1
tauri-plugin-hula/examples/tauri-app/public/svelte.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="26.6" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 308"><path fill="#FF3E00" d="M239.682 40.707C211.113-.182 154.69-12.301 113.895 13.69L42.247 59.356a82.198 82.198 0 0 0-37.135 55.056a86.566 86.566 0 0 0 8.536 55.576a82.425 82.425 0 0 0-12.296 30.719a87.596 87.596 0 0 0 14.964 66.244c28.574 40.893 84.997 53.007 125.787 27.016l71.648-45.664a82.182 82.182 0 0 0 37.135-55.057a86.601 86.601 0 0 0-8.53-55.577a82.409 82.409 0 0 0 12.29-30.718a87.573 87.573 0 0 0-14.963-66.244"></path><path fill="#FFF" d="M106.889 270.841c-23.102 6.007-47.497-3.036-61.103-22.648a52.685 52.685 0 0 1-9.003-39.85a49.978 49.978 0 0 1 1.713-6.693l1.35-4.115l3.671 2.697a92.447 92.447 0 0 0 28.036 14.007l2.663.808l-.245 2.659a16.067 16.067 0 0 0 2.89 10.656a17.143 17.143 0 0 0 18.397 6.828a15.786 15.786 0 0 0 4.403-1.935l71.67-45.672a14.922 14.922 0 0 0 6.734-9.977a15.923 15.923 0 0 0-2.713-12.011a17.156 17.156 0 0 0-18.404-6.832a15.78 15.78 0 0 0-4.396 1.933l-27.35 17.434a52.298 52.298 0 0 1-14.553 6.391c-23.101 6.007-47.497-3.036-61.101-22.649a52.681 52.681 0 0 1-9.004-39.849a49.428 49.428 0 0 1 22.34-33.114l71.664-45.677a52.218 52.218 0 0 1 14.563-6.398c23.101-6.007 47.497 3.036 61.101 22.648a52.685 52.685 0 0 1 9.004 39.85a50.559 50.559 0 0 1-1.713 6.692l-1.35 4.116l-3.67-2.693a92.373 92.373 0 0 0-28.037-14.013l-2.664-.809l.246-2.658a16.099 16.099 0 0 0-2.89-10.656a17.143 17.143 0 0 0-18.398-6.828a15.786 15.786 0 0 0-4.402 1.935l-71.67 45.674a14.898 14.898 0 0 0-6.73 9.975a15.9 15.9 0 0 0 2.709 12.012a17.156 17.156 0 0 0 18.404 6.832a15.841 15.841 0 0 0 4.402-1.935l27.345-17.427a52.147 52.147 0 0 1 14.552-6.397c23.101-6.006 47.497 3.037 61.102 22.65a52.681 52.681 0 0 1 9.003 39.848a49.453 49.453 0 0 1-22.34 33.12l-71.664 45.673a52.218 52.218 0 0 1-14.563 6.398"></path></svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
6
tauri-plugin-hula/examples/tauri-app/public/tauri.svg
Normal file
@@ -0,0 +1,6 @@
|
||||
<svg width="206" height="231" viewBox="0 0 206 231" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M143.143 84C143.143 96.1503 133.293 106 121.143 106C108.992 106 99.1426 96.1503 99.1426 84C99.1426 71.8497 108.992 62 121.143 62C133.293 62 143.143 71.8497 143.143 84Z" fill="#FFC131"/>
|
||||
<ellipse cx="84.1426" cy="147" rx="22" ry="22" transform="rotate(180 84.1426 147)" fill="#24C8DB"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M166.738 154.548C157.86 160.286 148.023 164.269 137.757 166.341C139.858 160.282 141 153.774 141 147C141 144.543 140.85 142.121 140.558 139.743C144.975 138.204 149.215 136.139 153.183 133.575C162.73 127.404 170.292 118.608 174.961 108.244C179.63 97.8797 181.207 86.3876 179.502 75.1487C177.798 63.9098 172.884 53.4021 165.352 44.8883C157.82 36.3744 147.99 30.2165 137.042 27.1546C126.095 24.0926 114.496 24.2568 103.64 27.6274C92.7839 30.998 83.1319 37.4317 75.8437 46.1553C74.9102 47.2727 74.0206 48.4216 73.176 49.5993C61.9292 50.8488 51.0363 54.0318 40.9629 58.9556C44.2417 48.4586 49.5653 38.6591 56.679 30.1442C67.0505 17.7298 80.7861 8.57426 96.2354 3.77762C111.685 -1.01901 128.19 -1.25267 143.769 3.10474C159.348 7.46215 173.337 16.2252 184.056 28.3411C194.775 40.457 201.767 55.4101 204.193 71.404C206.619 87.3978 204.374 103.752 197.73 118.501C191.086 133.25 180.324 145.767 166.738 154.548ZM41.9631 74.275L62.5557 76.8042C63.0459 72.813 63.9401 68.9018 65.2138 65.1274C57.0465 67.0016 49.2088 70.087 41.9631 74.275Z" fill="#FFC131"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M38.4045 76.4519C47.3493 70.6709 57.2677 66.6712 67.6171 64.6132C65.2774 70.9669 64 77.8343 64 85.0001C64 87.1434 64.1143 89.26 64.3371 91.3442C60.0093 92.8732 55.8533 94.9092 51.9599 97.4256C42.4128 103.596 34.8505 112.392 30.1816 122.756C25.5126 133.12 23.9357 144.612 25.6403 155.851C27.3449 167.09 32.2584 177.598 39.7906 186.112C47.3227 194.626 57.153 200.784 68.1003 203.846C79.0476 206.907 90.6462 206.743 101.502 203.373C112.359 200.002 122.011 193.568 129.299 184.845C130.237 183.722 131.131 182.567 131.979 181.383C143.235 180.114 154.132 176.91 164.205 171.962C160.929 182.49 155.596 192.319 148.464 200.856C138.092 213.27 124.357 222.426 108.907 227.222C93.458 232.019 76.9524 232.253 61.3736 227.895C45.7948 223.538 31.8055 214.775 21.0867 202.659C10.3679 190.543 3.37557 175.59 0.949823 159.596C-1.47592 143.602 0.768139 127.248 7.41237 112.499C14.0566 97.7497 24.8183 85.2327 38.4045 76.4519ZM163.062 156.711L163.062 156.711C162.954 156.773 162.846 156.835 162.738 156.897C162.846 156.835 162.954 156.773 163.062 156.711Z" fill="#24C8DB"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.5 KiB |
1
tauri-plugin-hula/examples/tauri-app/public/vite.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
4
tauri-plugin-hula/examples/tauri-app/src-tauri/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
# Generated by Cargo
|
||||
# will have compiled files and executables
|
||||
/target/
|
||||
|
||||
23
tauri-plugin-hula/examples/tauri-app/src-tauri/Cargo.toml
Normal file
@@ -0,0 +1,23 @@
|
||||
[package]
|
||||
name = "tauri-app"
|
||||
version = "0.1.0"
|
||||
description = "A Tauri App"
|
||||
authors = ["you"]
|
||||
license = ""
|
||||
repository = ""
|
||||
edition = "2021"
|
||||
rust-version = "1.77.2"
|
||||
|
||||
[lib]
|
||||
name = "tauri_app_lib"
|
||||
crate-type = ["staticlib", "cdylib", "rlib"]
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[build-dependencies]
|
||||
tauri-build = { version = "2.3.0", default-features = false }
|
||||
|
||||
[dependencies]
|
||||
tauri = { version = "2.6.2" }
|
||||
tauri-plugin-hula = { path = "../../../" }
|
||||
|
||||
3
tauri-plugin-hula/examples/tauri-app/src-tauri/build.rs
Normal file
@@ -0,0 +1,3 @@
|
||||
fn main() {
|
||||
tauri_build::build()
|
||||
}
|
||||
12
tauri-plugin-hula/examples/tauri-app/src-tauri/capabilities/default.json
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"$schema": "../gen/schemas/desktop-schema.json",
|
||||
"identifier": "default",
|
||||
"description": "enables the default permissions",
|
||||
"windows": [
|
||||
"main"
|
||||
],
|
||||
"permissions": [
|
||||
"core:default",
|
||||
"hula:default"
|
||||
]
|
||||
}
|
||||
1
tauri-plugin-hula/examples/tauri-app/src-tauri/gen/schemas/acl-manifests.json
vendored
Normal file
1
tauri-plugin-hula/examples/tauri-app/src-tauri/gen/schemas/capabilities.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"default":{"identifier":"default","description":"enables the default permissions","local":true,"windows":["main"],"permissions":["core:default","hula:default"]}}
|
||||
2214
tauri-plugin-hula/examples/tauri-app/src-tauri/gen/schemas/desktop-schema.json
vendored
Normal file
2214
tauri-plugin-hula/examples/tauri-app/src-tauri/gen/schemas/windows-schema.json
vendored
Normal file
BIN
tauri-plugin-hula/examples/tauri-app/src-tauri/icons/128x128.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 23 KiB |
BIN
tauri-plugin-hula/examples/tauri-app/src-tauri/icons/32x32.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
tauri-plugin-hula/examples/tauri-app/src-tauri/icons/icon.icns
Normal file
BIN
tauri-plugin-hula/examples/tauri-app/src-tauri/icons/icon.ico
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
tauri-plugin-hula/examples/tauri-app/src-tauri/icons/icon.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
14
tauri-plugin-hula/examples/tauri-app/src-tauri/src/lib.rs
Normal file
@@ -0,0 +1,14 @@
|
||||
// Learn more about Tauri commands at https://v2.tauri.app/develop/calling-rust/#commands
|
||||
#[tauri::command]
|
||||
fn greet(name: &str) -> String {
|
||||
format!("Hello, {}! You've been greeted from Rust!", name)
|
||||
}
|
||||
|
||||
#[cfg_attr(mobile, tauri::mobile_entry_point)]
|
||||
pub fn run() {
|
||||
tauri::Builder::default()
|
||||
.invoke_handler(tauri::generate_handler![greet])
|
||||
.plugin(tauri_plugin_hula::init())
|
||||
.run(tauri::generate_context!())
|
||||
.expect("error while running tauri application");
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
// Prevents additional console window on Windows in release, DO NOT REMOVE!!
|
||||
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
|
||||
|
||||
fn main() {
|
||||
tauri_app_lib::run();
|
||||
}
|
||||
37
tauri-plugin-hula/examples/tauri-app/src-tauri/tauri.conf.json
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"productName": "tauri-app",
|
||||
"version": "0.1.0",
|
||||
"identifier": "com.tauri.dev",
|
||||
"build": {
|
||||
"beforeDevCommand": "pnpm dev",
|
||||
"beforeBuildCommand": "pnpm build",
|
||||
"devUrl": "http://localhost:1420",
|
||||
"frontendDist": "../dist"
|
||||
},
|
||||
"app": {
|
||||
"withGlobalTauri": false,
|
||||
"security": {
|
||||
"csp": null
|
||||
},
|
||||
"windows": [
|
||||
{
|
||||
"fullscreen": false,
|
||||
"height": 600,
|
||||
"resizable": true,
|
||||
"title": "tauri-app",
|
||||
"width": 800
|
||||
}
|
||||
]
|
||||
},
|
||||
"bundle": {
|
||||
"active": true,
|
||||
"targets": "all",
|
||||
"icon": [
|
||||
"icons/32x32.png",
|
||||
"icons/128x128.png",
|
||||
"icons/128x128@2x.png",
|
||||
"icons/icon.icns",
|
||||
"icons/icon.ico"
|
||||
]
|
||||
}
|
||||
}
|
||||
54
tauri-plugin-hula/examples/tauri-app/src/App.svelte
Normal file
@@ -0,0 +1,54 @@
|
||||
<script>
|
||||
import Greet from './lib/Greet.svelte'
|
||||
import { ping } from 'tauri-plugin-hula-api'
|
||||
|
||||
let response = ''
|
||||
|
||||
function updateResponse(returnValue) {
|
||||
response += `[${new Date().toLocaleTimeString()}] ` + (typeof returnValue === 'string' ? returnValue : JSON.stringify(returnValue)) + '<br>'
|
||||
}
|
||||
|
||||
function _ping() {
|
||||
ping("Pong!").then(updateResponse).catch(updateResponse)
|
||||
}
|
||||
</script>
|
||||
|
||||
<main class="container">
|
||||
<h1>Welcome to Tauri!</h1>
|
||||
|
||||
<div class="row">
|
||||
<a href="https://vite.dev" target="_blank">
|
||||
<img src="/vite.svg" class="logo vite" alt="Vite Logo" />
|
||||
</a>
|
||||
<a href="https://tauri.app" target="_blank">
|
||||
<img src="/tauri.svg" class="logo tauri" alt="Tauri Logo" />
|
||||
</a>
|
||||
<a href="https://svelte.dev" target="_blank">
|
||||
<img src="/svelte.svg" class="logo svelte" alt="Svelte Logo" />
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
Click on the Tauri, Vite, and Svelte logos to learn more.
|
||||
</p>
|
||||
|
||||
<div class="row">
|
||||
<Greet />
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<button on:click="{_ping}">Ping</button>
|
||||
<div>{@html response}</div>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
|
||||
<style>
|
||||
.logo.vite:hover {
|
||||
filter: drop-shadow(0 0 2em #747bff);
|
||||
}
|
||||
|
||||
.logo.svelte:hover {
|
||||
filter: drop-shadow(0 0 2em #ff3e00);
|
||||
}
|
||||
</style>
|
||||
22
tauri-plugin-hula/examples/tauri-app/src/lib/Greet.svelte
Normal file
@@ -0,0 +1,22 @@
|
||||
<script>
|
||||
import { invoke } from "@tauri-apps/api/core"
|
||||
|
||||
let name = "";
|
||||
let greetMsg = ""
|
||||
|
||||
async function greet(){
|
||||
// Learn more about Tauri commands at https://v2.tauri.app/develop/calling-rust/#commands
|
||||
greetMsg = await invoke("greet", { name })
|
||||
}
|
||||
</script>
|
||||
|
||||
<div>
|
||||
<div class="row">
|
||||
<input id="greet-input" placeholder="Enter a name..." bind:value={name} />
|
||||
<button on:click={greet}>
|
||||
Greet
|
||||
</button>
|
||||
</div>
|
||||
<p>{greetMsg}</p>
|
||||
</div>
|
||||
|
||||
8
tauri-plugin-hula/examples/tauri-app/src/main.js
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
import './style.css'
|
||||
import App from './App.svelte'
|
||||
|
||||
const app = new App({
|
||||
target: document.getElementById('app')
|
||||
})
|
||||
|
||||
export default app
|
||||
102
tauri-plugin-hula/examples/tauri-app/src/style.css
vendored
Normal file
@@ -0,0 +1,102 @@
|
||||
:root {
|
||||
font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
|
||||
font-size: 16px;
|
||||
line-height: 24px;
|
||||
font-weight: 400;
|
||||
|
||||
color: #0f0f0f;
|
||||
background-color: #f6f6f6;
|
||||
|
||||
font-synthesis: none;
|
||||
text-rendering: optimizeLegibility;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
-webkit-text-size-adjust: 100%;
|
||||
}
|
||||
|
||||
.container {
|
||||
margin: 0;
|
||||
padding-top: 10vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.logo {
|
||||
height: 6em;
|
||||
padding: 1.5em;
|
||||
will-change: filter;
|
||||
transition: 0.75s;
|
||||
}
|
||||
|
||||
.logo.tauri:hover {
|
||||
filter: drop-shadow(0 0 2em #24c8db);
|
||||
}
|
||||
|
||||
.row {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
a {
|
||||
font-weight: 500;
|
||||
color: #646cff;
|
||||
text-decoration: inherit;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: #535bf2;
|
||||
}
|
||||
|
||||
h1 {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
input,
|
||||
button {
|
||||
border-radius: 8px;
|
||||
border: 1px solid transparent;
|
||||
padding: 0.6em 1.2em;
|
||||
font-size: 1em;
|
||||
font-weight: 500;
|
||||
font-family: inherit;
|
||||
color: #0f0f0f;
|
||||
background-color: #ffffff;
|
||||
transition: border-color 0.25s;
|
||||
box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
button {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
button:hover {
|
||||
border-color: #396cd8;
|
||||
}
|
||||
|
||||
input,
|
||||
button {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
#greet-input {
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
color: #f6f6f6;
|
||||
background-color: #2f2f2f;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: #24c8db;
|
||||
}
|
||||
|
||||
input,
|
||||
button {
|
||||
color: #ffffff;
|
||||
background-color: #0f0f0f98;
|
||||
}
|
||||
}
|
||||
2
tauri-plugin-hula/examples/tauri-app/src/vite-env.d.ts
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
/// <reference types="svelte" />
|
||||
/// <reference types="vite/client" />
|
||||
26
tauri-plugin-hula/examples/tauri-app/vite.config.js
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
import { defineConfig } from 'vite'
|
||||
import { svelte } from '@sveltejs/vite-plugin-svelte'
|
||||
|
||||
const host = process.env.TAURI_DEV_HOST
|
||||
|
||||
// https://vite.dev/config/
|
||||
export default defineConfig({
|
||||
plugins: [svelte()],
|
||||
|
||||
// Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build`
|
||||
// prevent Vite from obscuring rust errors
|
||||
clearScreen: false,
|
||||
// tauri expects a fixed port, fail if that port is not available
|
||||
server: {
|
||||
host: host || false,
|
||||
port: 1420,
|
||||
strictPort: true,
|
||||
hmr: host
|
||||
? {
|
||||
protocol: 'ws',
|
||||
host,
|
||||
port: 1421
|
||||
}
|
||||
: undefined
|
||||
}
|
||||
})
|
||||
9
tauri-plugin-hula/guest-js/index.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import { invoke } from '@tauri-apps/api/core'
|
||||
|
||||
export async function ping(value: string): Promise<string | null> {
|
||||
return await invoke<{ value?: string }>('plugin:hula|ping', {
|
||||
payload: {
|
||||
value
|
||||
}
|
||||
}).then((r) => (r.value ? r.value : null))
|
||||
}
|
||||
10
tauri-plugin-hula/ios/.gitignore
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
.DS_Store
|
||||
/.build
|
||||
/Packages
|
||||
/*.xcodeproj
|
||||
xcuserdata/
|
||||
DerivedData/
|
||||
.swiftpm/config/registries.json
|
||||
.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
|
||||
.netrc
|
||||
Package.resolved
|
||||
32
tauri-plugin-hula/ios/Package.swift
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
// swift-tools-version:5.3
|
||||
// The swift-tools-version declares the minimum version of Swift required to build this package.
|
||||
|
||||
import PackageDescription
|
||||
|
||||
let package = Package(
|
||||
name: "tauri-plugin-hula",
|
||||
platforms: [
|
||||
.macOS(.v10_13),
|
||||
.iOS(.v13),
|
||||
],
|
||||
products: [
|
||||
// Products define the executables and libraries a package produces, and make them visible to other packages.
|
||||
.library(
|
||||
name: "tauri-plugin-hula",
|
||||
type: .static,
|
||||
targets: ["tauri-plugin-hula"]),
|
||||
],
|
||||
dependencies: [
|
||||
.package(name: "Tauri", path: "../.tauri/tauri-api")
|
||||
],
|
||||
targets: [
|
||||
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
|
||||
// Targets can depend on other targets in this package, and on products in packages this package depends on.
|
||||
.target(
|
||||
name: "tauri-plugin-hula",
|
||||
dependencies: [
|
||||
.byName(name: "Tauri")
|
||||
],
|
||||
path: "Sources")
|
||||
]
|
||||
)
|
||||
3
tauri-plugin-hula/ios/README.md
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
# Tauri Plugin hula
|
||||
|
||||
A description of this package.
|
||||
20
tauri-plugin-hula/ios/Sources/ExamplePlugin.swift
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
import SwiftRs
|
||||
import Tauri
|
||||
import UIKit
|
||||
import WebKit
|
||||
|
||||
class PingArgs: Decodable {
|
||||
let value: String?
|
||||
}
|
||||
|
||||
class ExamplePlugin: Plugin {
|
||||
@objc public func ping(_ invoke: Invoke) throws {
|
||||
let args = try invoke.parseArgs(PingArgs.self)
|
||||
invoke.resolve(["value": args.value ?? ""])
|
||||
}
|
||||
}
|
||||
|
||||
@_cdecl("init_plugin_hula")
|
||||
func initPlugin() -> Plugin {
|
||||
return ExamplePlugin()
|
||||
}
|
||||
8
tauri-plugin-hula/ios/Tests/PluginTests/PluginTests.swift
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
import XCTest
|
||||
@testable import ExamplePlugin
|
||||
|
||||
final class ExamplePluginTests: XCTestCase {
|
||||
func testExample() throws {
|
||||
let plugin = ExamplePlugin()
|
||||
}
|
||||
}
|
||||
30
tauri-plugin-hula/package.json
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"name": "tauri-plugin-hula-api",
|
||||
"version": "0.1.0",
|
||||
"author": "You",
|
||||
"description": "",
|
||||
"type": "module",
|
||||
"types": "./dist-js/index.d.ts",
|
||||
"main": "./dist-js/index.cjs",
|
||||
"module": "./dist-js/index.js",
|
||||
"exports": {
|
||||
"types": "./dist-js/index.d.ts",
|
||||
"import": "./dist-js/index.js",
|
||||
"require": "./dist-js/index.cjs"
|
||||
},
|
||||
"files": ["dist-js", "README.md"],
|
||||
"scripts": {
|
||||
"build": "rollup -c",
|
||||
"prepublishOnly": "pnpm build",
|
||||
"pretest": "pnpm build"
|
||||
},
|
||||
"dependencies": {
|
||||
"@tauri-apps/api": ">=2.0.0-beta.6"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@rollup/plugin-typescript": "^12.0.0",
|
||||
"rollup": "^4.9.6",
|
||||
"typescript": "^5.3.3",
|
||||
"tslib": "^2.6.2"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
# Automatically generated - DO NOT EDIT!
|
||||
|
||||
"$schema" = "../../schemas/schema.json"
|
||||
|
||||
[[permission]]
|
||||
identifier = "allow-ping"
|
||||
description = "Enables the ping command without any pre-configured scope."
|
||||
commands.allow = ["ping"]
|
||||
|
||||
[[permission]]
|
||||
identifier = "deny-ping"
|
||||
description = "Denies the ping command without any pre-configured scope."
|
||||
commands.deny = ["ping"]
|
||||
43
tauri-plugin-hula/permissions/autogenerated/reference.md
Normal file
@@ -0,0 +1,43 @@
|
||||
## Default Permission
|
||||
|
||||
Default permissions for the plugin
|
||||
|
||||
#### This default permission set includes the following:
|
||||
|
||||
- `allow-ping`
|
||||
|
||||
## Permission Table
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<th>Identifier</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
|
||||
`hula:allow-ping`
|
||||
|
||||
</td>
|
||||
<td>
|
||||
|
||||
Enables the ping command without any pre-configured scope.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
|
||||
`hula:deny-ping`
|
||||
|
||||
</td>
|
||||
<td>
|
||||
|
||||
Denies the ping command without any pre-configured scope.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
3
tauri-plugin-hula/permissions/default.toml
Normal file
@@ -0,0 +1,3 @@
|
||||
[default]
|
||||
description = "Default permissions for the plugin"
|
||||
permissions = ["allow-ping"]
|
||||
279
tauri-plugin-hula/permissions/schemas/schema.json
vendored
Normal file
@@ -0,0 +1,279 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"title": "PermissionFile",
|
||||
"description": "Permission file that can define a default permission, a set of permissions or a list of inlined permissions.",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"default": {
|
||||
"description": "The default permission set for the plugin",
|
||||
"anyOf": [
|
||||
{
|
||||
"$ref": "#/definitions/DefaultPermission"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
]
|
||||
},
|
||||
"set": {
|
||||
"description": "A list of permissions sets defined",
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/PermissionSet"
|
||||
}
|
||||
},
|
||||
"permission": {
|
||||
"description": "A list of inlined permissions",
|
||||
"default": [],
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/Permission"
|
||||
}
|
||||
}
|
||||
},
|
||||
"definitions": {
|
||||
"DefaultPermission": {
|
||||
"description": "The default permission set of the plugin.\n\nWorks similarly to a permission with the \"default\" identifier.",
|
||||
"type": "object",
|
||||
"required": ["permissions"],
|
||||
"properties": {
|
||||
"version": {
|
||||
"description": "The version of the permission.",
|
||||
"type": ["integer", "null"],
|
||||
"format": "uint64",
|
||||
"minimum": 1.0
|
||||
},
|
||||
"description": {
|
||||
"description": "Human-readable description of what the permission does. Tauri convention is to use `<h4>` headings in markdown content for Tauri documentation generation purposes.",
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"permissions": {
|
||||
"description": "All permissions this set contains.",
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"PermissionSet": {
|
||||
"description": "A set of direct permissions grouped together under a new name.",
|
||||
"type": "object",
|
||||
"required": ["description", "identifier", "permissions"],
|
||||
"properties": {
|
||||
"identifier": {
|
||||
"description": "A unique identifier for the permission.",
|
||||
"type": "string"
|
||||
},
|
||||
"description": {
|
||||
"description": "Human-readable description of what the permission does.",
|
||||
"type": "string"
|
||||
},
|
||||
"permissions": {
|
||||
"description": "All permissions this set contains.",
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/PermissionKind"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Permission": {
|
||||
"description": "Descriptions of explicit privileges of commands.\n\nIt can enable commands to be accessible in the frontend of the application.\n\nIf the scope is defined it can be used to fine grain control the access of individual or multiple commands.",
|
||||
"type": "object",
|
||||
"required": ["identifier"],
|
||||
"properties": {
|
||||
"version": {
|
||||
"description": "The version of the permission.",
|
||||
"type": ["integer", "null"],
|
||||
"format": "uint64",
|
||||
"minimum": 1.0
|
||||
},
|
||||
"identifier": {
|
||||
"description": "A unique identifier for the permission.",
|
||||
"type": "string"
|
||||
},
|
||||
"description": {
|
||||
"description": "Human-readable description of what the permission does. Tauri internal convention is to use `<h4>` headings in markdown content for Tauri documentation generation purposes.",
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"commands": {
|
||||
"description": "Allowed or denied commands when using this permission.",
|
||||
"default": {
|
||||
"allow": [],
|
||||
"deny": []
|
||||
},
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "#/definitions/Commands"
|
||||
}
|
||||
]
|
||||
},
|
||||
"scope": {
|
||||
"description": "Allowed or denied scoped when using this permission.",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "#/definitions/Scopes"
|
||||
}
|
||||
]
|
||||
},
|
||||
"platforms": {
|
||||
"description": "Target platforms this permission applies. By default all platforms are affected by this permission.",
|
||||
"type": ["array", "null"],
|
||||
"items": {
|
||||
"$ref": "#/definitions/Target"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Commands": {
|
||||
"description": "Allowed and denied commands inside a permission.\n\nIf two commands clash inside of `allow` and `deny`, it should be denied by default.",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"allow": {
|
||||
"description": "Allowed command.",
|
||||
"default": [],
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"deny": {
|
||||
"description": "Denied command, which takes priority.",
|
||||
"default": [],
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Scopes": {
|
||||
"description": "An argument for fine grained behavior control of Tauri commands.\n\nIt can be of any serde serializable type and is used to allow or prevent certain actions inside a Tauri command. The configured scope is passed to the command and will be enforced by the command implementation.\n\n## Example\n\n```json { \"allow\": [{ \"path\": \"$HOME/**\" }], \"deny\": [{ \"path\": \"$HOME/secret.txt\" }] } ```",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"allow": {
|
||||
"description": "Data that defines what is allowed by the scope.",
|
||||
"type": ["array", "null"],
|
||||
"items": {
|
||||
"$ref": "#/definitions/Value"
|
||||
}
|
||||
},
|
||||
"deny": {
|
||||
"description": "Data that defines what is denied by the scope. This should be prioritized by validation logic.",
|
||||
"type": ["array", "null"],
|
||||
"items": {
|
||||
"$ref": "#/definitions/Value"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Value": {
|
||||
"description": "All supported ACL values.",
|
||||
"anyOf": [
|
||||
{
|
||||
"description": "Represents a null JSON value.",
|
||||
"type": "null"
|
||||
},
|
||||
{
|
||||
"description": "Represents a [`bool`].",
|
||||
"type": "boolean"
|
||||
},
|
||||
{
|
||||
"description": "Represents a valid ACL [`Number`].",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "#/definitions/Number"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"description": "Represents a [`String`].",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Represents a list of other [`Value`]s.",
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/Value"
|
||||
}
|
||||
},
|
||||
{
|
||||
"description": "Represents a map of [`String`] keys to [`Value`]s.",
|
||||
"type": "object",
|
||||
"additionalProperties": {
|
||||
"$ref": "#/definitions/Value"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"Number": {
|
||||
"description": "A valid ACL number.",
|
||||
"anyOf": [
|
||||
{
|
||||
"description": "Represents an [`i64`].",
|
||||
"type": "integer",
|
||||
"format": "int64"
|
||||
},
|
||||
{
|
||||
"description": "Represents a [`f64`].",
|
||||
"type": "number",
|
||||
"format": "double"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Target": {
|
||||
"description": "Platform target.",
|
||||
"oneOf": [
|
||||
{
|
||||
"description": "MacOS.",
|
||||
"type": "string",
|
||||
"enum": ["macOS"]
|
||||
},
|
||||
{
|
||||
"description": "Windows.",
|
||||
"type": "string",
|
||||
"enum": ["windows"]
|
||||
},
|
||||
{
|
||||
"description": "Linux.",
|
||||
"type": "string",
|
||||
"enum": ["linux"]
|
||||
},
|
||||
{
|
||||
"description": "Android.",
|
||||
"type": "string",
|
||||
"enum": ["android"]
|
||||
},
|
||||
{
|
||||
"description": "iOS.",
|
||||
"type": "string",
|
||||
"enum": ["iOS"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"PermissionKind": {
|
||||
"type": "string",
|
||||
"oneOf": [
|
||||
{
|
||||
"description": "Enables the ping command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"const": "allow-ping",
|
||||
"markdownDescription": "Enables the ping command without any pre-configured scope."
|
||||
},
|
||||
{
|
||||
"description": "Denies the ping command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"const": "deny-ping",
|
||||
"markdownDescription": "Denies the ping command without any pre-configured scope."
|
||||
},
|
||||
{
|
||||
"description": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-ping`",
|
||||
"type": "string",
|
||||
"const": "default",
|
||||
"markdownDescription": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-ping`"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
27
tauri-plugin-hula/rollup.config.js
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
import { readFileSync } from 'node:fs'
|
||||
import { dirname, join } from 'node:path'
|
||||
import { cwd } from 'node:process'
|
||||
import typescript from '@rollup/plugin-typescript'
|
||||
|
||||
const pkg = JSON.parse(readFileSync(join(cwd(), 'package.json'), 'utf8'))
|
||||
|
||||
export default {
|
||||
input: 'guest-js/index.ts',
|
||||
output: [
|
||||
{
|
||||
file: pkg.exports.import,
|
||||
format: 'esm'
|
||||
},
|
||||
{
|
||||
file: pkg.exports.require,
|
||||
format: 'cjs'
|
||||
}
|
||||
],
|
||||
plugins: [
|
||||
typescript({
|
||||
declaration: true,
|
||||
declarationDir: dirname(pkg.exports.import)
|
||||
})
|
||||
],
|
||||
external: [/^@tauri-apps\/api/, ...Object.keys(pkg.dependencies || {}), ...Object.keys(pkg.peerDependencies || {})]
|
||||
}
|
||||
13
tauri-plugin-hula/src/commands.rs
Normal file
@@ -0,0 +1,13 @@
|
||||
use tauri::{AppHandle, command, Runtime};
|
||||
|
||||
use crate::models::*;
|
||||
use crate::Result;
|
||||
use crate::HulaExt;
|
||||
|
||||
#[command]
|
||||
pub(crate) async fn ping<R: Runtime>(
|
||||
app: AppHandle<R>,
|
||||
payload: PingRequest,
|
||||
) -> Result<PingResponse> {
|
||||
app.hula().ping(payload)
|
||||
}
|
||||
22
tauri-plugin-hula/src/desktop.rs
Normal file
@@ -0,0 +1,22 @@
|
||||
use serde::de::DeserializeOwned;
|
||||
use tauri::{plugin::PluginApi, AppHandle, Runtime};
|
||||
|
||||
use crate::models::*;
|
||||
|
||||
pub fn init<R: Runtime, C: DeserializeOwned>(
|
||||
app: &AppHandle<R>,
|
||||
_api: PluginApi<R, C>,
|
||||
) -> crate::Result<Hula<R>> {
|
||||
Ok(Hula(app.clone()))
|
||||
}
|
||||
|
||||
/// Access to the hula APIs.
|
||||
pub struct Hula<R: Runtime>(AppHandle<R>);
|
||||
|
||||
impl<R: Runtime> Hula<R> {
|
||||
pub fn ping(&self, payload: PingRequest) -> crate::Result<PingResponse> {
|
||||
Ok(PingResponse {
|
||||
value: payload.value,
|
||||
})
|
||||
}
|
||||
}
|
||||
21
tauri-plugin-hula/src/error.rs
Normal file
@@ -0,0 +1,21 @@
|
||||
use serde::{ser::Serializer, Serialize};
|
||||
|
||||
pub type Result<T> = std::result::Result<T, Error>;
|
||||
|
||||
#[derive(Debug, thiserror::Error)]
|
||||
pub enum Error {
|
||||
#[error(transparent)]
|
||||
Io(#[from] std::io::Error),
|
||||
#[cfg(mobile)]
|
||||
#[error(transparent)]
|
||||
PluginInvoke(#[from] tauri::plugin::mobile::PluginInvokeError),
|
||||
}
|
||||
|
||||
impl Serialize for Error {
|
||||
fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
|
||||
where
|
||||
S: Serializer,
|
||||
{
|
||||
serializer.serialize_str(self.to_string().as_ref())
|
||||
}
|
||||
}
|
||||
48
tauri-plugin-hula/src/lib.rs
Normal file
@@ -0,0 +1,48 @@
|
||||
use tauri::{
|
||||
plugin::{Builder, TauriPlugin},
|
||||
Manager, Runtime,
|
||||
};
|
||||
|
||||
pub use models::*;
|
||||
|
||||
#[cfg(desktop)]
|
||||
mod desktop;
|
||||
#[cfg(mobile)]
|
||||
mod mobile;
|
||||
|
||||
mod commands;
|
||||
mod error;
|
||||
mod models;
|
||||
|
||||
pub use error::{Error, Result};
|
||||
|
||||
#[cfg(desktop)]
|
||||
use desktop::Hula;
|
||||
#[cfg(mobile)]
|
||||
use mobile::Hula;
|
||||
|
||||
/// Extensions to [`tauri::App`], [`tauri::AppHandle`] and [`tauri::Window`] to access the hula APIs.
|
||||
pub trait HulaExt<R: Runtime> {
|
||||
fn hula(&self) -> &Hula<R>;
|
||||
}
|
||||
|
||||
impl<R: Runtime, T: Manager<R>> crate::HulaExt<R> for T {
|
||||
fn hula(&self) -> &Hula<R> {
|
||||
self.state::<Hula<R>>().inner()
|
||||
}
|
||||
}
|
||||
|
||||
/// Initializes the plugin.
|
||||
pub fn init<R: Runtime>() -> TauriPlugin<R> {
|
||||
Builder::new("hula")
|
||||
.invoke_handler(tauri::generate_handler![commands::ping])
|
||||
.setup(|app, api| {
|
||||
#[cfg(mobile)]
|
||||
let hula = mobile::init(app, api)?;
|
||||
#[cfg(desktop)]
|
||||
let hula = desktop::init(app, api)?;
|
||||
app.manage(hula);
|
||||
Ok(())
|
||||
})
|
||||
.build()
|
||||
}
|
||||
34
tauri-plugin-hula/src/mobile.rs
Normal file
@@ -0,0 +1,34 @@
|
||||
use serde::de::DeserializeOwned;
|
||||
use tauri::{
|
||||
plugin::{PluginApi, PluginHandle},
|
||||
AppHandle, Runtime,
|
||||
};
|
||||
|
||||
use crate::models::*;
|
||||
|
||||
#[cfg(target_os = "ios")]
|
||||
tauri::ios_plugin_binding!(init_plugin_hula);
|
||||
|
||||
// initializes the Kotlin or Swift plugin classes
|
||||
pub fn init<R: Runtime, C: DeserializeOwned>(
|
||||
_app: &AppHandle<R>,
|
||||
api: PluginApi<R, C>,
|
||||
) -> crate::Result<Hula<R>> {
|
||||
#[cfg(target_os = "android")]
|
||||
let handle = api.register_android_plugin("com.plugin.hula", "ExamplePlugin")?;
|
||||
#[cfg(target_os = "ios")]
|
||||
let handle = api.register_ios_plugin(init_plugin_hula)?;
|
||||
Ok(Hula(handle))
|
||||
}
|
||||
|
||||
/// Access to the hula APIs.
|
||||
pub struct Hula<R: Runtime>(PluginHandle<R>);
|
||||
|
||||
impl<R: Runtime> Hula<R> {
|
||||
pub fn ping(&self, payload: PingRequest) -> crate::Result<PingResponse> {
|
||||
self
|
||||
.0
|
||||
.run_mobile_plugin("ping", payload)
|
||||
.map_err(Into::into)
|
||||
}
|
||||
}
|
||||
13
tauri-plugin-hula/src/models.rs
Normal file
@@ -0,0 +1,13 @@
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
#[derive(Debug, Deserialize, Serialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct PingRequest {
|
||||
pub value: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct PingResponse {
|
||||
pub value: Option<String>,
|
||||
}
|
||||
14
tauri-plugin-hula/tsconfig.json
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "es2021",
|
||||
"module": "esnext",
|
||||
"moduleResolution": "bundler",
|
||||
"skipLibCheck": true,
|
||||
"strict": true,
|
||||
"noUnusedLocals": true,
|
||||
"noImplicitAny": true,
|
||||
"noEmit": true
|
||||
},
|
||||
"include": ["guest-js/*.ts"],
|
||||
"exclude": ["dist-js", "node_modules"]
|
||||
}
|
||||