Published on

tauri で離席時間の管理と Slack のステータス更新をするデスクトップアプリを作った

Authors

transferred from scrapbox

https://github.com/ko-da-k/afk-track

モチベーション

  • リモートワーク中の急な家事育児対応が発生したときに、いちいち同僚上司に伝えるリードタイムがもったいない
  • Slack のステータスを見てもらえば、緊急の育児対応してもらってるんだなとわかってもらえる
  • Slack のステータス(online/offline と、status で家事育児対応中であることを表示)を反映しつつ、どのくらい自分が離席したのかも記録しておきたい
  • ショートカットキー一発で離席と Slack のステータスを更新できれば楽だなと思った
  • 業務で使うツールのため、どこかにホスティングして通信を伴うものは使いづらい。そのためデスクトップアプリや CLI 等が候補に上がったが、ここではデスクトップアプリを選択した

tauri での開発について

https://tauri.app/ Backend が Rust、Frontend は著名なフロントエンドのライブラリやフレームワークを使用可能。

今回作ったツールではほとんど Rust は書かず、React + Vite で書いた。 フロントのコードそのままに standalone なデスクトップアプリをかけるというのは開発体験として非常によかった。 UIも tailwind + daisyui そのまま利用できたのでデスクトップ特有のレイアウトコードを書いたりはしていない。

Tips やハマりどころ

今回作ったツールでは、sqlite でデータ永続化をしている。 Mac だと ~/Library/Application\ Support 配下にデータが保存されるのでデバッグ時はここに保存されている sqlite の db を見ながら作業していた。 vscode が推奨されているが、いまいち Debugger の設定がうまく行かなかったので print debug に頼らないといけなかった。 フロントのログは以下のような rust のコードで devtool を立ち上げられるのでフロントのデバッグはこちらを利用した。

main.rs
fn main() {
    // 中略
    tauri::Builder::default()
        // この setup で devtool を起動
        .setup(|app| {
            #[cfg(debug_assertions)] // only include this code on debug builds
            {
            let window = app.get_window("main").unwrap();
            window.open_devtools();
            window.close_devtools();
            }
            Ok(())
        })
        // 中略
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

Window 呼び出しは App 側ではなく hammerspoon で行っている。これで、1秒で離席することが可能になりそう