mirror of
https://github.com/mountain-loop/yaak.git
synced 2026-05-15 12:17:18 +02:00
Compare commits
13 Commits
v2026.4.0-
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dcfdf077e7 | ||
|
|
bde5a474cc | ||
|
|
21f1dad7a4 | ||
|
|
6dac1265f3 | ||
|
|
77ab293f87 | ||
|
|
471a099b9b | ||
|
|
b0b282535f | ||
|
|
19ed8c2f0d | ||
|
|
d7e67cf13c | ||
|
|
1b154ba550 | ||
|
|
10559c8f4f | ||
|
|
d2dc719cc6 | ||
|
|
50f33b45b9 |
@@ -8,7 +8,7 @@ Make Yaak runnable as a standalone CLI without Tauri as a dependency. The core R
|
|||||||
|
|
||||||
```
|
```
|
||||||
crates/ # Core crates - should NOT depend on Tauri
|
crates/ # Core crates - should NOT depend on Tauri
|
||||||
crates-tauri/ # Tauri-specific crates (yaak-app, yaak-tauri-utils, etc.)
|
crates-tauri/ # Tauri-specific crates (yaak-app-client, yaak-tauri-utils, etc.)
|
||||||
crates-cli/ # CLI crate (yaak-cli)
|
crates-cli/ # CLI crate (yaak-cli)
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -16,7 +16,7 @@ crates-cli/ # CLI crate (yaak-cli)
|
|||||||
|
|
||||||
### 1. Folder Restructure
|
### 1. Folder Restructure
|
||||||
|
|
||||||
- Moved Tauri-dependent app code to `crates-tauri/yaak-app/`
|
- Moved Tauri-dependent app code to `crates-tauri/yaak-app-client/`
|
||||||
- Created `crates-tauri/yaak-tauri-utils/` for shared Tauri utilities (window traits, api_client, error handling)
|
- Created `crates-tauri/yaak-tauri-utils/` for shared Tauri utilities (window traits, api_client, error handling)
|
||||||
- Created `crates-cli/yaak-cli/` for the standalone CLI
|
- Created `crates-cli/yaak-cli/` for the standalone CLI
|
||||||
|
|
||||||
@@ -50,14 +50,14 @@ crates-cli/ # CLI crate (yaak-cli)
|
|||||||
3. Move extension traits (e.g., `SomethingManagerExt`) to yaak-app or yaak-tauri-utils
|
3. Move extension traits (e.g., `SomethingManagerExt`) to yaak-app or yaak-tauri-utils
|
||||||
4. Initialize managers in yaak-app's `.setup()` block
|
4. Initialize managers in yaak-app's `.setup()` block
|
||||||
5. Remove `tauri` from Cargo.toml dependencies
|
5. Remove `tauri` from Cargo.toml dependencies
|
||||||
6. Update `crates-tauri/yaak-app/capabilities/default.json` to remove the plugin permission
|
6. Update `crates-tauri/yaak-app-client/capabilities/default.json` to remove the plugin permission
|
||||||
7. Replace `tauri::async_runtime::block_on` with `tokio::runtime::Handle::current().block_on()`
|
7. Replace `tauri::async_runtime::block_on` with `tokio::runtime::Handle::current().block_on()`
|
||||||
|
|
||||||
## Key Files
|
## Key Files
|
||||||
|
|
||||||
- `crates-tauri/yaak-app/src/lib.rs` - Main Tauri app, setup block initializes managers
|
- `crates-tauri/yaak-app-client/src/lib.rs` - Main Tauri app, setup block initializes managers
|
||||||
- `crates-tauri/yaak-app/src/commands.rs` - Migrated Tauri commands
|
- `crates-tauri/yaak-app-client/src/commands.rs` - Migrated Tauri commands
|
||||||
- `crates-tauri/yaak-app/src/models_ext.rs` - Database plugin and extension traits
|
- `crates-tauri/yaak-app-client/src/models_ext.rs` - Database plugin and extension traits
|
||||||
- `crates-tauri/yaak-tauri-utils/src/window.rs` - WorkspaceWindowTrait for window state
|
- `crates-tauri/yaak-tauri-utils/src/window.rs` - WorkspaceWindowTrait for window state
|
||||||
- `crates/yaak-models/src/lib.rs` - Contains `init_standalone()` for CLI usage
|
- `crates/yaak-models/src/lib.rs` - Contains `init_standalone()` for CLI usage
|
||||||
|
|
||||||
@@ -79,5 +79,5 @@ e718a5f1 Refactor models_ext to use init_standalone from yaak-models
|
|||||||
## Testing
|
## Testing
|
||||||
|
|
||||||
- Run `cargo check -p <crate>` to verify a crate builds without Tauri
|
- Run `cargo check -p <crate>` to verify a crate builds without Tauri
|
||||||
- Run `npm run app-dev` to test the Tauri app still works
|
- Run `npm run client:dev` to test the Tauri app still works
|
||||||
- Run `cargo run -p yaak-cli -- --help` to test the CLI
|
- Run `cargo run -p yaak-cli -- --help` to test the CLI
|
||||||
|
|||||||
4
.gitattributes
vendored
4
.gitattributes
vendored
@@ -1,5 +1,5 @@
|
|||||||
crates-tauri/yaak-app/vendored/**/* linguist-generated=true
|
crates-tauri/yaak-app-client/vendored/**/* linguist-generated=true
|
||||||
crates-tauri/yaak-app/gen/schemas/**/* linguist-generated=true
|
crates-tauri/yaak-app-client/gen/schemas/**/* linguist-generated=true
|
||||||
**/bindings/* linguist-generated=true
|
**/bindings/* linguist-generated=true
|
||||||
crates/yaak-templates/pkg/* linguist-generated=true
|
crates/yaak-templates/pkg/* linguist-generated=true
|
||||||
|
|
||||||
|
|||||||
11
.github/workflows/release-app.yml
vendored
11
.github/workflows/release-app.yml
vendored
@@ -125,8 +125,8 @@ jobs:
|
|||||||
security list-keychain -d user -s $KEYCHAIN_PATH
|
security list-keychain -d user -s $KEYCHAIN_PATH
|
||||||
|
|
||||||
# Sign vendored binaries with hardened runtime and their specific entitlements
|
# Sign vendored binaries with hardened runtime and their specific entitlements
|
||||||
codesign --force --options runtime --entitlements crates-tauri/yaak-app/macos/entitlements.yaakprotoc.plist --sign "$APPLE_SIGNING_IDENTITY" crates-tauri/yaak-app/vendored/protoc/yaakprotoc || true
|
codesign --force --options runtime --entitlements crates-tauri/yaak-app-client/macos/entitlements.yaakprotoc.plist --sign "$APPLE_SIGNING_IDENTITY" crates-tauri/yaak-app-client/vendored/protoc/yaakprotoc || true
|
||||||
codesign --force --options runtime --entitlements crates-tauri/yaak-app/macos/entitlements.yaaknode.plist --sign "$APPLE_SIGNING_IDENTITY" crates-tauri/yaak-app/vendored/node/yaaknode || true
|
codesign --force --options runtime --entitlements crates-tauri/yaak-app-client/macos/entitlements.yaaknode.plist --sign "$APPLE_SIGNING_IDENTITY" crates-tauri/yaak-app-client/vendored/node/yaaknode || true
|
||||||
|
|
||||||
- uses: tauri-apps/tauri-action@v0
|
- uses: tauri-apps/tauri-action@v0
|
||||||
env:
|
env:
|
||||||
@@ -155,7 +155,8 @@ jobs:
|
|||||||
releaseBody: "[Changelog __VERSION__](https://yaak.app/blog/__VERSION__)"
|
releaseBody: "[Changelog __VERSION__](https://yaak.app/blog/__VERSION__)"
|
||||||
releaseDraft: true
|
releaseDraft: true
|
||||||
prerelease: true
|
prerelease: true
|
||||||
args: "${{ matrix.args }} --config ./crates-tauri/yaak-app/tauri.release.conf.json"
|
projectPath: ./crates-tauri/yaak-app-client
|
||||||
|
args: "${{ matrix.args }} --config ./tauri.release.conf.json"
|
||||||
|
|
||||||
# Build a per-machine NSIS installer for enterprise deployment (PDQ, SCCM, Intune)
|
# Build a per-machine NSIS installer for enterprise deployment (PDQ, SCCM, Intune)
|
||||||
- name: Build and upload machine-wide installer (Windows only)
|
- name: Build and upload machine-wide installer (Windows only)
|
||||||
@@ -171,7 +172,9 @@ jobs:
|
|||||||
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
|
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
|
||||||
run: |
|
run: |
|
||||||
Get-ChildItem -Recurse -Path target -File -Filter "*.exe.sig" | Remove-Item -Force
|
Get-ChildItem -Recurse -Path target -File -Filter "*.exe.sig" | Remove-Item -Force
|
||||||
npx tauri bundle ${{ matrix.args }} --bundles nsis --config ./crates-tauri/yaak-app/tauri.release.conf.json --config '{"bundle":{"createUpdaterArtifacts":true,"windows":{"nsis":{"installMode":"perMachine"}}}}'
|
Push-Location crates-tauri/yaak-app-client
|
||||||
|
npx tauri bundle ${{ matrix.args }} --bundles nsis --config ./tauri.release.conf.json --config '{"bundle":{"createUpdaterArtifacts":true,"windows":{"nsis":{"installMode":"perMachine"}}}}'
|
||||||
|
Pop-Location
|
||||||
$setup = Get-ChildItem -Recurse -Path target -Filter "*setup*.exe" | Select-Object -First 1
|
$setup = Get-ChildItem -Recurse -Path target -Filter "*setup*.exe" | Select-Object -First 1
|
||||||
$setupSig = "$($setup.FullName).sig"
|
$setupSig = "$($setup.FullName).sig"
|
||||||
$dest = $setup.FullName -replace '-setup\.exe$', '-setup-machine.exe'
|
$dest = $setup.FullName -replace '-setup\.exe$', '-setup-machine.exe'
|
||||||
|
|||||||
6
.github/workflows/release-cli-npm.yml
vendored
6
.github/workflows/release-cli-npm.yml
vendored
@@ -45,8 +45,8 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: vendored-assets
|
name: vendored-assets
|
||||||
path: |
|
path: |
|
||||||
crates-tauri/yaak-app/vendored/plugin-runtime/index.cjs
|
crates-tauri/yaak-app-client/vendored/plugin-runtime/index.cjs
|
||||||
crates-tauri/yaak-app/vendored/plugins
|
crates-tauri/yaak-app-client/vendored/plugins
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
|
|
||||||
build-binaries:
|
build-binaries:
|
||||||
@@ -107,7 +107,7 @@ jobs:
|
|||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: vendored-assets
|
name: vendored-assets
|
||||||
path: crates-tauri/yaak-app/vendored
|
path: crates-tauri/yaak-app-client/vendored
|
||||||
|
|
||||||
- name: Set CLI build version
|
- name: Set CLI build version
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -39,7 +39,8 @@ codebook.toml
|
|||||||
target
|
target
|
||||||
|
|
||||||
# Per-worktree Tauri config (generated by post-checkout hook)
|
# Per-worktree Tauri config (generated by post-checkout hook)
|
||||||
crates-tauri/yaak-app/tauri.worktree.conf.json
|
crates-tauri/yaak-app-client/tauri.worktree.conf.json
|
||||||
|
crates-tauri/yaak-app-proxy/tauri.worktree.conf.json
|
||||||
|
|
||||||
# Tauri auto-generated permission files
|
# Tauri auto-generated permission files
|
||||||
**/permissions/autogenerated
|
**/permissions/autogenerated
|
||||||
|
|||||||
3
.oxfmtignore
Normal file
3
.oxfmtignore
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
**/bindings/**
|
||||||
|
**/routeTree.gen.ts
|
||||||
|
crates/yaak-templates/pkg/**
|
||||||
@@ -1,4 +1,8 @@
|
|||||||
{
|
{
|
||||||
"printWidth": 100,
|
"printWidth": 100,
|
||||||
"ignorePatterns": ["**/bindings/**", "crates/yaak-templates/pkg/**", "src-web/routeTree.gen.ts"]
|
"ignorePatterns": [
|
||||||
|
"**/bindings/**",
|
||||||
|
"crates/yaak-templates/pkg/**",
|
||||||
|
"apps/yaak-client/routeTree.gen.ts"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +1,2 @@
|
|||||||
vp lint
|
vp lint
|
||||||
|
vp staged
|
||||||
|
|||||||
1169
Cargo.lock
generated
1169
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
27
Cargo.toml
27
Cargo.toml
@@ -2,6 +2,9 @@
|
|||||||
resolver = "2"
|
resolver = "2"
|
||||||
members = [
|
members = [
|
||||||
"crates/yaak",
|
"crates/yaak",
|
||||||
|
# Common/foundation crates
|
||||||
|
"crates/common/yaak-database",
|
||||||
|
"crates/common/yaak-rpc",
|
||||||
# Shared crates (no Tauri dependency)
|
# Shared crates (no Tauri dependency)
|
||||||
"crates/yaak-core",
|
"crates/yaak-core",
|
||||||
"crates/yaak-common",
|
"crates/yaak-common",
|
||||||
@@ -17,14 +20,19 @@ members = [
|
|||||||
"crates/yaak-tls",
|
"crates/yaak-tls",
|
||||||
"crates/yaak-ws",
|
"crates/yaak-ws",
|
||||||
"crates/yaak-api",
|
"crates/yaak-api",
|
||||||
|
"crates/yaak-proxy",
|
||||||
|
# Proxy-specific crates
|
||||||
|
"crates-proxy/yaak-proxy-lib",
|
||||||
# CLI crates
|
# CLI crates
|
||||||
"crates-cli/yaak-cli",
|
"crates-cli/yaak-cli",
|
||||||
# Tauri-specific crates
|
# Tauri-specific crates
|
||||||
"crates-tauri/yaak-app",
|
"crates-tauri/yaak-app-client",
|
||||||
|
"crates-tauri/yaak-app-proxy",
|
||||||
"crates-tauri/yaak-fonts",
|
"crates-tauri/yaak-fonts",
|
||||||
"crates-tauri/yaak-license",
|
"crates-tauri/yaak-license",
|
||||||
"crates-tauri/yaak-mac-window",
|
"crates-tauri/yaak-mac-window",
|
||||||
"crates-tauri/yaak-tauri-utils",
|
"crates-tauri/yaak-tauri-utils",
|
||||||
|
"crates-tauri/yaak-window",
|
||||||
]
|
]
|
||||||
|
|
||||||
[workspace.dependencies]
|
[workspace.dependencies]
|
||||||
@@ -39,14 +47,18 @@ schemars = { version = "0.8.22", features = ["chrono"] }
|
|||||||
serde = "1.0.228"
|
serde = "1.0.228"
|
||||||
serde_json = "1.0.145"
|
serde_json = "1.0.145"
|
||||||
sha2 = "0.10.9"
|
sha2 = "0.10.9"
|
||||||
tauri = "2.9.5"
|
tauri = "2.11.1"
|
||||||
tauri-plugin = "2.5.2"
|
tauri-plugin = "2.6.1"
|
||||||
tauri-plugin-dialog = "2.4.2"
|
tauri-plugin-dialog = "2.7.1"
|
||||||
tauri-plugin-shell = "2.3.3"
|
tauri-plugin-shell = "2.3.5"
|
||||||
thiserror = "2.0.17"
|
thiserror = "2.0.17"
|
||||||
tokio = "1.48.0"
|
tokio = "1.48.0"
|
||||||
ts-rs = "11.1.0"
|
ts-rs = "11.1.0"
|
||||||
|
|
||||||
|
# Internal crates - common/foundation
|
||||||
|
yaak-database = { path = "crates/common/yaak-database" }
|
||||||
|
yaak-rpc = { path = "crates/common/yaak-rpc" }
|
||||||
|
|
||||||
# Internal crates - shared
|
# Internal crates - shared
|
||||||
yaak-core = { path = "crates/yaak-core" }
|
yaak-core = { path = "crates/yaak-core" }
|
||||||
yaak = { path = "crates/yaak" }
|
yaak = { path = "crates/yaak" }
|
||||||
@@ -63,12 +75,17 @@ yaak-templates = { path = "crates/yaak-templates" }
|
|||||||
yaak-tls = { path = "crates/yaak-tls" }
|
yaak-tls = { path = "crates/yaak-tls" }
|
||||||
yaak-ws = { path = "crates/yaak-ws" }
|
yaak-ws = { path = "crates/yaak-ws" }
|
||||||
yaak-api = { path = "crates/yaak-api" }
|
yaak-api = { path = "crates/yaak-api" }
|
||||||
|
yaak-proxy = { path = "crates/yaak-proxy" }
|
||||||
|
|
||||||
|
# Internal crates - proxy
|
||||||
|
yaak-proxy-lib = { path = "crates-proxy/yaak-proxy-lib" }
|
||||||
|
|
||||||
# Internal crates - Tauri-specific
|
# Internal crates - Tauri-specific
|
||||||
yaak-fonts = { path = "crates-tauri/yaak-fonts" }
|
yaak-fonts = { path = "crates-tauri/yaak-fonts" }
|
||||||
yaak-license = { path = "crates-tauri/yaak-license" }
|
yaak-license = { path = "crates-tauri/yaak-license" }
|
||||||
yaak-mac-window = { path = "crates-tauri/yaak-mac-window" }
|
yaak-mac-window = { path = "crates-tauri/yaak-mac-window" }
|
||||||
yaak-tauri-utils = { path = "crates-tauri/yaak-tauri-utils" }
|
yaak-tauri-utils = { path = "crates-tauri/yaak-tauri-utils" }
|
||||||
|
yaak-window = { path = "crates-tauri/yaak-window" }
|
||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
strip = false
|
strip = false
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://github.com/JamesIves/github-sponsors-readme-action">
|
<a href="https://github.com/JamesIves/github-sponsors-readme-action">
|
||||||
<img width="200px" src="https://github.com/mountain-loop/yaak/raw/main/crates-tauri/yaak-app/icons/icon.png">
|
<img width="200px" src="https://github.com/mountain-loop/yaak/raw/main/crates-tauri/yaak-app-client/icons/icon.png">
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { createWorkspaceModel, type Folder, modelTypeLabel } from "@yaakapp-internal/models";
|
import { createWorkspaceModel, type Folder, modelTypeLabel } from "@yaakapp-internal/models";
|
||||||
import { applySync, calculateSync } from "@yaakapp-internal/sync";
|
import { applySync, calculateSync } from "@yaakapp-internal/sync";
|
||||||
import { Banner } from "../components/core/Banner";
|
|
||||||
import { Button } from "../components/core/Button";
|
import { Button } from "../components/core/Button";
|
||||||
import { InlineCode } from "../components/core/InlineCode";
|
|
||||||
import {
|
import {
|
||||||
|
Banner,
|
||||||
|
InlineCode,
|
||||||
Table,
|
Table,
|
||||||
TableBody,
|
TableBody,
|
||||||
TableCell,
|
TableCell,
|
||||||
@@ -11,7 +11,7 @@ import {
|
|||||||
TableHeaderCell,
|
TableHeaderCell,
|
||||||
TableRow,
|
TableRow,
|
||||||
TruncatedWideTableCell,
|
TruncatedWideTableCell,
|
||||||
} from "../components/core/Table";
|
} from "@yaakapp-internal/ui";
|
||||||
import { activeWorkspaceIdAtom } from "../hooks/useActiveWorkspace";
|
import { activeWorkspaceIdAtom } from "../hooks/useActiveWorkspace";
|
||||||
import { createFastMutation } from "../hooks/useFastMutation";
|
import { createFastMutation } from "../hooks/useFastMutation";
|
||||||
import { showDialog } from "../lib/dialog";
|
import { showDialog } from "../lib/dialog";
|
||||||
@@ -1,10 +1,8 @@
|
|||||||
import type { HttpRequest } from "@yaakapp-internal/models";
|
import type { HttpRequest } from "@yaakapp-internal/models";
|
||||||
|
import { Banner, HStack, InlineCode, VStack } from "@yaakapp-internal/ui";
|
||||||
import mime from "mime";
|
import mime from "mime";
|
||||||
import { useKeyValue } from "../hooks/useKeyValue";
|
import { useKeyValue } from "../hooks/useKeyValue";
|
||||||
import { Banner } from "./core/Banner";
|
|
||||||
import { Button } from "./core/Button";
|
import { Button } from "./core/Button";
|
||||||
import { InlineCode } from "./core/InlineCode";
|
|
||||||
import { HStack, VStack } from "./core/Stacks";
|
|
||||||
import { SelectFile } from "./SelectFile";
|
import { SelectFile } from "./SelectFile";
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
@@ -1,15 +1,14 @@
|
|||||||
import { open } from "@tauri-apps/plugin-dialog";
|
import { open } from "@tauri-apps/plugin-dialog";
|
||||||
import { gitClone } from "@yaakapp-internal/git";
|
import { gitClone } from "@yaakapp-internal/git";
|
||||||
|
import { Banner, VStack } from "@yaakapp-internal/ui";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { openWorkspaceFromSyncDir } from "../commands/openWorkspaceFromSyncDir";
|
import { openWorkspaceFromSyncDir } from "../commands/openWorkspaceFromSyncDir";
|
||||||
import { appInfo } from "../lib/appInfo";
|
import { appInfo } from "../lib/appInfo";
|
||||||
import { showErrorToast } from "../lib/toast";
|
import { showErrorToast } from "../lib/toast";
|
||||||
import { Banner } from "./core/Banner";
|
|
||||||
import { Button } from "./core/Button";
|
import { Button } from "./core/Button";
|
||||||
import { Checkbox } from "./core/Checkbox";
|
import { Checkbox } from "./core/Checkbox";
|
||||||
import { IconButton } from "./core/IconButton";
|
import { IconButton } from "./core/IconButton";
|
||||||
import { PlainInput } from "./core/PlainInput";
|
import { PlainInput } from "./core/PlainInput";
|
||||||
import { VStack } from "./core/Stacks";
|
|
||||||
import { promptCredentials } from "./git/credentials";
|
import { promptCredentials } from "./git/credentials";
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
import { workspacesAtom } from "@yaakapp-internal/models";
|
import { workspacesAtom } from "@yaakapp-internal/models";
|
||||||
|
import { Heading, Icon, useDebouncedState } from "@yaakapp-internal/ui";
|
||||||
import classNames from "classnames";
|
import classNames from "classnames";
|
||||||
import { fuzzyFilter } from "fuzzbunny";
|
import { fuzzyFilter } from "fuzzbunny";
|
||||||
import { useAtomValue } from "jotai";
|
import { useAtomValue } from "jotai";
|
||||||
@@ -21,7 +22,6 @@ import { useActiveRequest } from "../hooks/useActiveRequest";
|
|||||||
import { activeWorkspaceIdAtom } from "../hooks/useActiveWorkspace";
|
import { activeWorkspaceIdAtom } from "../hooks/useActiveWorkspace";
|
||||||
import { useAllRequests } from "../hooks/useAllRequests";
|
import { useAllRequests } from "../hooks/useAllRequests";
|
||||||
import { useCreateWorkspace } from "../hooks/useCreateWorkspace";
|
import { useCreateWorkspace } from "../hooks/useCreateWorkspace";
|
||||||
import { useDebouncedState } from "../hooks/useDebouncedState";
|
|
||||||
import { useEnvironmentsBreakdown } from "../hooks/useEnvironmentsBreakdown";
|
import { useEnvironmentsBreakdown } from "../hooks/useEnvironmentsBreakdown";
|
||||||
import { useGrpcRequestActions } from "../hooks/useGrpcRequestActions";
|
import { useGrpcRequestActions } from "../hooks/useGrpcRequestActions";
|
||||||
import type { HotkeyAction } from "../hooks/useHotKey";
|
import type { HotkeyAction } from "../hooks/useHotKey";
|
||||||
@@ -47,10 +47,8 @@ import { router } from "../lib/router";
|
|||||||
import { setWorkspaceSearchParams } from "../lib/setWorkspaceSearchParams";
|
import { setWorkspaceSearchParams } from "../lib/setWorkspaceSearchParams";
|
||||||
import { CookieDialog } from "./CookieDialog";
|
import { CookieDialog } from "./CookieDialog";
|
||||||
import { Button } from "./core/Button";
|
import { Button } from "./core/Button";
|
||||||
import { Heading } from "./core/Heading";
|
|
||||||
import { Hotkey } from "./core/Hotkey";
|
import { Hotkey } from "./core/Hotkey";
|
||||||
import { HttpMethodTag } from "./core/HttpMethodTag";
|
import { HttpMethodTag } from "./core/HttpMethodTag";
|
||||||
import { Icon } from "./core/Icon";
|
|
||||||
import { PlainInput } from "./core/PlainInput";
|
import { PlainInput } from "./core/PlainInput";
|
||||||
|
|
||||||
interface CommandPaletteGroup {
|
interface CommandPaletteGroup {
|
||||||
@@ -1,14 +1,12 @@
|
|||||||
import type { HttpRequest } from "@yaakapp-internal/models";
|
import type { HttpRequest } from "@yaakapp-internal/models";
|
||||||
import { patchModel } from "@yaakapp-internal/models";
|
import { patchModel } from "@yaakapp-internal/models";
|
||||||
|
import { Banner, HStack, InlineCode } from "@yaakapp-internal/ui";
|
||||||
import type { ReactNode } from "react";
|
import type { ReactNode } from "react";
|
||||||
import { useToggle } from "../hooks/useToggle";
|
import { useToggle } from "../hooks/useToggle";
|
||||||
import { showConfirm } from "../lib/confirm";
|
import { showConfirm } from "../lib/confirm";
|
||||||
import { Banner } from "./core/Banner";
|
|
||||||
import { Button } from "./core/Button";
|
import { Button } from "./core/Button";
|
||||||
import { InlineCode } from "./core/InlineCode";
|
|
||||||
import { Link } from "./core/Link";
|
import { Link } from "./core/Link";
|
||||||
import { SizeTag } from "./core/SizeTag";
|
import { SizeTag } from "./core/SizeTag";
|
||||||
import { HStack } from "./core/Stacks";
|
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
children: ReactNode;
|
children: ReactNode;
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
import type { HttpResponse } from "@yaakapp-internal/models";
|
import type { HttpResponse } from "@yaakapp-internal/models";
|
||||||
|
import { Banner, HStack, InlineCode } from "@yaakapp-internal/ui";
|
||||||
import { type ReactNode, useMemo } from "react";
|
import { type ReactNode, useMemo } from "react";
|
||||||
import { useSaveResponse } from "../hooks/useSaveResponse";
|
import { useSaveResponse } from "../hooks/useSaveResponse";
|
||||||
import { useToggle } from "../hooks/useToggle";
|
import { useToggle } from "../hooks/useToggle";
|
||||||
@@ -6,11 +7,8 @@ import { isProbablyTextContentType } from "../lib/contentType";
|
|||||||
import { getContentTypeFromHeaders } from "../lib/model_util";
|
import { getContentTypeFromHeaders } from "../lib/model_util";
|
||||||
import { getResponseBodyText } from "../lib/responseBody";
|
import { getResponseBodyText } from "../lib/responseBody";
|
||||||
import { CopyButton } from "./CopyButton";
|
import { CopyButton } from "./CopyButton";
|
||||||
import { Banner } from "./core/Banner";
|
|
||||||
import { Button } from "./core/Button";
|
import { Button } from "./core/Button";
|
||||||
import { InlineCode } from "./core/InlineCode";
|
|
||||||
import { SizeTag } from "./core/SizeTag";
|
import { SizeTag } from "./core/SizeTag";
|
||||||
import { HStack } from "./core/Stacks";
|
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
children: ReactNode;
|
children: ReactNode;
|
||||||
@@ -1,15 +1,13 @@
|
|||||||
import type { HttpResponse } from "@yaakapp-internal/models";
|
import type { HttpResponse } from "@yaakapp-internal/models";
|
||||||
|
import { Banner, HStack, InlineCode } from "@yaakapp-internal/ui";
|
||||||
import { type ReactNode, useMemo } from "react";
|
import { type ReactNode, useMemo } from "react";
|
||||||
import { getRequestBodyText as getHttpResponseRequestBodyText } from "../hooks/useHttpRequestBody";
|
import { getRequestBodyText as getHttpResponseRequestBodyText } from "../hooks/useHttpRequestBody";
|
||||||
import { useToggle } from "../hooks/useToggle";
|
import { useToggle } from "../hooks/useToggle";
|
||||||
import { isProbablyTextContentType } from "../lib/contentType";
|
import { isProbablyTextContentType } from "../lib/contentType";
|
||||||
import { getContentTypeFromHeaders } from "../lib/model_util";
|
import { getContentTypeFromHeaders } from "../lib/model_util";
|
||||||
import { CopyButton } from "./CopyButton";
|
import { CopyButton } from "./CopyButton";
|
||||||
import { Banner } from "./core/Banner";
|
|
||||||
import { Button } from "./core/Button";
|
import { Button } from "./core/Button";
|
||||||
import { InlineCode } from "./core/InlineCode";
|
|
||||||
import { SizeTag } from "./core/SizeTag";
|
import { SizeTag } from "./core/SizeTag";
|
||||||
import { HStack } from "./core/Stacks";
|
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
children: ReactNode;
|
children: ReactNode;
|
||||||
@@ -2,9 +2,8 @@ import type { Cookie } from "@yaakapp-internal/models";
|
|||||||
import { cookieJarsAtom, patchModel } from "@yaakapp-internal/models";
|
import { cookieJarsAtom, patchModel } from "@yaakapp-internal/models";
|
||||||
import { useAtomValue } from "jotai";
|
import { useAtomValue } from "jotai";
|
||||||
import { cookieDomain } from "../lib/model_util";
|
import { cookieDomain } from "../lib/model_util";
|
||||||
import { Banner } from "./core/Banner";
|
import { Banner, InlineCode } from "@yaakapp-internal/ui";
|
||||||
import { IconButton } from "./core/IconButton";
|
import { IconButton } from "./core/IconButton";
|
||||||
import { InlineCode } from "./core/InlineCode";
|
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
cookieJarId: string | null;
|
cookieJarId: string | null;
|
||||||
@@ -9,9 +9,8 @@ import { showPrompt } from "../lib/prompt";
|
|||||||
import { setWorkspaceSearchParams } from "../lib/setWorkspaceSearchParams";
|
import { setWorkspaceSearchParams } from "../lib/setWorkspaceSearchParams";
|
||||||
import { CookieDialog } from "./CookieDialog";
|
import { CookieDialog } from "./CookieDialog";
|
||||||
import { Dropdown, type DropdownItem } from "./core/Dropdown";
|
import { Dropdown, type DropdownItem } from "./core/Dropdown";
|
||||||
import { Icon } from "./core/Icon";
|
import { Icon, InlineCode } from "@yaakapp-internal/ui";
|
||||||
import { IconButton } from "./core/IconButton";
|
import { IconButton } from "./core/IconButton";
|
||||||
import { InlineCode } from "./core/InlineCode";
|
|
||||||
|
|
||||||
export const CookieDropdown = memo(function CookieDropdown() {
|
export const CookieDropdown = memo(function CookieDropdown() {
|
||||||
const activeCookieJar = useActiveCookieJar();
|
const activeCookieJar = useActiveCookieJar();
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useTimedBoolean } from "../hooks/useTimedBoolean";
|
import { useTimedBoolean } from "@yaakapp-internal/ui";
|
||||||
import { copyToClipboard } from "../lib/copy";
|
import { copyToClipboard } from "../lib/copy";
|
||||||
import { showToast } from "../lib/toast";
|
import { showToast } from "../lib/toast";
|
||||||
import type { ButtonProps } from "./core/Button";
|
import type { ButtonProps } from "./core/Button";
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
import { useTimedBoolean } from "../hooks/useTimedBoolean";
|
import { IconButton, type IconButtonProps, useTimedBoolean } from "@yaakapp-internal/ui";
|
||||||
import { copyToClipboard } from "../lib/copy";
|
import { copyToClipboard } from "../lib/copy";
|
||||||
import { showToast } from "../lib/toast";
|
import { showToast } from "../lib/toast";
|
||||||
import type { IconButtonProps } from "./core/IconButton";
|
|
||||||
import { IconButton } from "./core/IconButton";
|
|
||||||
|
|
||||||
interface Props extends Omit<IconButtonProps, "onClick" | "icon"> {
|
interface Props extends Omit<IconButtonProps, "onClick" | "icon"> {
|
||||||
text: string | (() => Promise<string | null>);
|
text: string | (() => Promise<string | null>);
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
import { gitMutations } from "@yaakapp-internal/git";
|
import { gitMutations } from "@yaakapp-internal/git";
|
||||||
import type { WorkspaceMeta } from "@yaakapp-internal/models";
|
import type { WorkspaceMeta } from "@yaakapp-internal/models";
|
||||||
import { createGlobalModel, updateModel } from "@yaakapp-internal/models";
|
import { createGlobalModel, updateModel } from "@yaakapp-internal/models";
|
||||||
|
import { VStack } from "@yaakapp-internal/ui";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { router } from "../lib/router";
|
import { router } from "../lib/router";
|
||||||
import { setupOrConfigureEncryption } from "../lib/setupOrConfigureEncryption";
|
import { setupOrConfigureEncryption } from "../lib/setupOrConfigureEncryption";
|
||||||
@@ -10,7 +11,6 @@ import { Button } from "./core/Button";
|
|||||||
import { Checkbox } from "./core/Checkbox";
|
import { Checkbox } from "./core/Checkbox";
|
||||||
import { Label } from "./core/Label";
|
import { Label } from "./core/Label";
|
||||||
import { PlainInput } from "./core/PlainInput";
|
import { PlainInput } from "./core/PlainInput";
|
||||||
import { VStack } from "./core/Stacks";
|
|
||||||
import { EncryptionHelp } from "./EncryptionHelp";
|
import { EncryptionHelp } from "./EncryptionHelp";
|
||||||
import { gitCallbacks } from "./git/callbacks";
|
import { gitCallbacks } from "./git/callbacks";
|
||||||
import { SyncToFilesystemSetting } from "./SyncToFilesystemSetting";
|
import { SyncToFilesystemSetting } from "./SyncToFilesystemSetting";
|
||||||
@@ -1,13 +1,21 @@
|
|||||||
import type { DnsOverride, Workspace } from "@yaakapp-internal/models";
|
import type { DnsOverride, Workspace } from "@yaakapp-internal/models";
|
||||||
import { patchModel } from "@yaakapp-internal/models";
|
import { patchModel } from "@yaakapp-internal/models";
|
||||||
import { useCallback, useId, useMemo } from "react";
|
|
||||||
import { fireAndForget } from "../lib/fireAndForget";
|
import { fireAndForget } from "../lib/fireAndForget";
|
||||||
|
import {
|
||||||
|
HStack,
|
||||||
|
Table,
|
||||||
|
TableBody,
|
||||||
|
TableCell,
|
||||||
|
TableHead,
|
||||||
|
TableHeaderCell,
|
||||||
|
TableRow,
|
||||||
|
VStack,
|
||||||
|
} from "@yaakapp-internal/ui";
|
||||||
|
import { useCallback, useId, useMemo } from "react";
|
||||||
import { Button } from "./core/Button";
|
import { Button } from "./core/Button";
|
||||||
import { Checkbox } from "./core/Checkbox";
|
import { Checkbox } from "./core/Checkbox";
|
||||||
import { IconButton } from "./core/IconButton";
|
import { IconButton } from "./core/IconButton";
|
||||||
import { PlainInput } from "./core/PlainInput";
|
import { PlainInput } from "./core/PlainInput";
|
||||||
import { HStack, VStack } from "./core/Stacks";
|
|
||||||
import { Table, TableBody, TableCell, TableHead, TableHeaderCell, TableRow } from "./core/Table";
|
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
workspace: Workspace;
|
workspace: Workspace;
|
||||||
@@ -11,6 +11,7 @@ import type {
|
|||||||
FormInputText,
|
FormInputText,
|
||||||
JsonPrimitive,
|
JsonPrimitive,
|
||||||
} from "@yaakapp-internal/plugins";
|
} from "@yaakapp-internal/plugins";
|
||||||
|
import { Banner, VStack } from "@yaakapp-internal/ui";
|
||||||
import classNames from "classnames";
|
import classNames from "classnames";
|
||||||
import { useAtomValue } from "jotai";
|
import { useAtomValue } from "jotai";
|
||||||
import { useCallback, useEffect, useMemo } from "react";
|
import { useCallback, useEffect, useMemo } from "react";
|
||||||
@@ -19,7 +20,6 @@ import { useRandomKey } from "../hooks/useRandomKey";
|
|||||||
import { capitalize } from "../lib/capitalize";
|
import { capitalize } from "../lib/capitalize";
|
||||||
import { showDialog } from "../lib/dialog";
|
import { showDialog } from "../lib/dialog";
|
||||||
import { resolvedModelName } from "../lib/resolvedModelName";
|
import { resolvedModelName } from "../lib/resolvedModelName";
|
||||||
import { Banner } from "./core/Banner";
|
|
||||||
import { Checkbox } from "./core/Checkbox";
|
import { Checkbox } from "./core/Checkbox";
|
||||||
import { DetailsBanner } from "./core/DetailsBanner";
|
import { DetailsBanner } from "./core/DetailsBanner";
|
||||||
import { Editor } from "./core/Editor/LazyEditor";
|
import { Editor } from "./core/Editor/LazyEditor";
|
||||||
@@ -31,7 +31,6 @@ import type { Pair } from "./core/PairEditor";
|
|||||||
import { PairEditor } from "./core/PairEditor";
|
import { PairEditor } from "./core/PairEditor";
|
||||||
import { PlainInput } from "./core/PlainInput";
|
import { PlainInput } from "./core/PlainInput";
|
||||||
import { Select } from "./core/Select";
|
import { Select } from "./core/Select";
|
||||||
import { VStack } from "./core/Stacks";
|
|
||||||
import { Markdown } from "./Markdown";
|
import { Markdown } from "./Markdown";
|
||||||
import { SelectFile } from "./SelectFile";
|
import { SelectFile } from "./SelectFile";
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import { VStack } from "./core/Stacks";
|
import { VStack } from "@yaakapp-internal/ui";
|
||||||
|
|
||||||
export function EncryptionHelp() {
|
export function EncryptionHelp() {
|
||||||
return (
|
return (
|
||||||
@@ -8,7 +8,7 @@ import type { ButtonProps } from "./core/Button";
|
|||||||
import { Button } from "./core/Button";
|
import { Button } from "./core/Button";
|
||||||
import type { DropdownItem } from "./core/Dropdown";
|
import type { DropdownItem } from "./core/Dropdown";
|
||||||
import { Dropdown } from "./core/Dropdown";
|
import { Dropdown } from "./core/Dropdown";
|
||||||
import { Icon } from "./core/Icon";
|
import { Icon } from "@yaakapp-internal/ui";
|
||||||
import { EnvironmentColorIndicator } from "./EnvironmentColorIndicator";
|
import { EnvironmentColorIndicator } from "./EnvironmentColorIndicator";
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { ColorIndicator } from "./ColorIndicator";
|
import { ColorIndicator } from "./ColorIndicator";
|
||||||
import { Banner } from "./core/Banner";
|
import { Banner } from "@yaakapp-internal/ui";
|
||||||
import { Button } from "./core/Button";
|
import { Button } from "./core/Button";
|
||||||
import { ColorPickerWithThemeColors } from "./core/ColorPicker";
|
import { ColorPickerWithThemeColors } from "./core/ColorPicker";
|
||||||
|
|
||||||
@@ -1,34 +1,38 @@
|
|||||||
import type { Environment, Workspace } from "@yaakapp-internal/models";
|
import type { Environment, Workspace } from "@yaakapp-internal/models";
|
||||||
import { duplicateModel, patchModel } from "@yaakapp-internal/models";
|
import { duplicateModel, patchModel } from "@yaakapp-internal/models";
|
||||||
|
import type { TreeHandle, TreeNode, TreeProps } from "@yaakapp-internal/ui";
|
||||||
|
import { Banner, Icon, InlineCode, SplitLayout, Tree } from "@yaakapp-internal/ui";
|
||||||
import { atom, useAtomValue } from "jotai";
|
import { atom, useAtomValue } from "jotai";
|
||||||
import { useCallback, useLayoutEffect, useMemo, useRef, useState } from "react";
|
import { atomFamily } from "jotai-family";
|
||||||
|
import { useCallback, useLayoutEffect, useRef, useState } from "react";
|
||||||
import { createSubEnvironmentAndActivate } from "../commands/createEnvironment";
|
import { createSubEnvironmentAndActivate } from "../commands/createEnvironment";
|
||||||
import { activeWorkspaceAtom, activeWorkspaceIdAtom } from "../hooks/useActiveWorkspace";
|
import { activeWorkspaceAtom, activeWorkspaceIdAtom } from "../hooks/useActiveWorkspace";
|
||||||
import {
|
import {
|
||||||
environmentsBreakdownAtom,
|
environmentsBreakdownAtom,
|
||||||
useEnvironmentsBreakdown,
|
useEnvironmentsBreakdown,
|
||||||
} from "../hooks/useEnvironmentsBreakdown";
|
} from "../hooks/useEnvironmentsBreakdown";
|
||||||
|
import { useHotKey } from "../hooks/useHotKey";
|
||||||
|
import { atomWithKVStorage } from "../lib/atoms/atomWithKVStorage";
|
||||||
import { deleteModelWithConfirm } from "../lib/deleteModelWithConfirm";
|
import { deleteModelWithConfirm } from "../lib/deleteModelWithConfirm";
|
||||||
import { fireAndForget } from "../lib/fireAndForget";
|
import { fireAndForget } from "../lib/fireAndForget";
|
||||||
import { jotaiStore } from "../lib/jotai";
|
import { jotaiStore } from "../lib/jotai";
|
||||||
import { isBaseEnvironment, isSubEnvironment } from "../lib/model_util";
|
import { isBaseEnvironment, isSubEnvironment } from "../lib/model_util";
|
||||||
import { resolvedModelName } from "../lib/resolvedModelName";
|
import { resolvedModelName } from "../lib/resolvedModelName";
|
||||||
import { showColorPicker } from "../lib/showColorPicker";
|
import { showColorPicker } from "../lib/showColorPicker";
|
||||||
import { Banner } from "./core/Banner";
|
|
||||||
import type { ContextMenuProps, DropdownItem } from "./core/Dropdown";
|
import type { ContextMenuProps, DropdownItem } from "./core/Dropdown";
|
||||||
import { Icon } from "./core/Icon";
|
import { ContextMenu } from "./core/Dropdown";
|
||||||
import { IconButton } from "./core/IconButton";
|
import { IconButton } from "./core/IconButton";
|
||||||
import { IconTooltip } from "./core/IconTooltip";
|
import { IconTooltip } from "./core/IconTooltip";
|
||||||
import { InlineCode } from "./core/InlineCode";
|
|
||||||
import type { PairEditorHandle } from "./core/PairEditor";
|
import type { PairEditorHandle } from "./core/PairEditor";
|
||||||
import { SplitLayout } from "./core/SplitLayout";
|
|
||||||
import type { TreeNode } from "./core/tree/common";
|
|
||||||
import type { TreeHandle, TreeProps } from "./core/tree/Tree";
|
|
||||||
import { Tree } from "./core/tree/Tree";
|
|
||||||
import { EnvironmentColorIndicator } from "./EnvironmentColorIndicator";
|
import { EnvironmentColorIndicator } from "./EnvironmentColorIndicator";
|
||||||
import { EnvironmentEditor } from "./EnvironmentEditor";
|
import { EnvironmentEditor } from "./EnvironmentEditor";
|
||||||
import { EnvironmentSharableTooltip } from "./EnvironmentSharableTooltip";
|
import { EnvironmentSharableTooltip } from "./EnvironmentSharableTooltip";
|
||||||
|
|
||||||
|
const collapsedFamily = atomFamily((treeId: string) => {
|
||||||
|
const key = ["env_collapsed", treeId ?? "n/a"];
|
||||||
|
return atomWithKVStorage<Record<string, boolean>>(key, {});
|
||||||
|
});
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
initialEnvironmentId: string | null;
|
initialEnvironmentId: string | null;
|
||||||
setRef?: (ref: PairEditorHandle | null) => void;
|
setRef?: (ref: PairEditorHandle | null) => void;
|
||||||
@@ -49,7 +53,7 @@ export function EnvironmentEditDialog({ initialEnvironmentId, setRef }: Props) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<SplitLayout
|
<SplitLayout
|
||||||
name="env_editor"
|
storageKey="env_editor"
|
||||||
defaultRatio={0.75}
|
defaultRatio={0.75}
|
||||||
layout="horizontal"
|
layout="horizontal"
|
||||||
className="gap-0"
|
className="gap-0"
|
||||||
@@ -113,7 +117,7 @@ function EnvironmentEditDialogSidebar({
|
|||||||
const treeRef = useRef<TreeHandle>(null);
|
const treeRef = useRef<TreeHandle>(null);
|
||||||
const { baseEnvironment, baseEnvironments } = useEnvironmentsBreakdown();
|
const { baseEnvironment, baseEnvironments } = useEnvironmentsBreakdown();
|
||||||
|
|
||||||
// oxlint-disable-next-line react-hooks/exhaustive-deps
|
// oxlint-disable-next-line react-hooks/exhaustive-deps -- none
|
||||||
useLayoutEffect(() => {
|
useLayoutEffect(() => {
|
||||||
if (selectedEnvironmentId == null) return;
|
if (selectedEnvironmentId == null) return;
|
||||||
treeRef.current?.selectItem(selectedEnvironmentId);
|
treeRef.current?.selectItem(selectedEnvironmentId);
|
||||||
@@ -130,44 +134,60 @@ function EnvironmentEditDialogSidebar({
|
|||||||
[baseEnvironment?.id, selectedEnvironmentId, setSelectedEnvironmentId],
|
[baseEnvironment?.id, selectedEnvironmentId, setSelectedEnvironmentId],
|
||||||
);
|
);
|
||||||
|
|
||||||
const actions = useMemo(() => {
|
const treeHasFocus = useCallback(() => treeRef.current?.hasFocus() ?? false, []);
|
||||||
const enable = () => treeRef.current?.hasFocus() ?? false;
|
|
||||||
|
|
||||||
const actions = {
|
const getSelectedTreeModels = useCallback(
|
||||||
"sidebar.selected.rename": {
|
() => treeRef.current?.getSelectedItems() as TreeModel[] | undefined,
|
||||||
enable,
|
[],
|
||||||
allowDefault: true,
|
);
|
||||||
priority: 100,
|
|
||||||
cb: async (items: TreeModel[]) => {
|
|
||||||
const item = items[0];
|
|
||||||
if (items.length === 1 && item != null) {
|
|
||||||
treeRef.current?.renameItem(item.id);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"sidebar.selected.delete": {
|
|
||||||
priority: 100,
|
|
||||||
enable,
|
|
||||||
cb: (items: TreeModel[]) => deleteModelWithConfirm(items),
|
|
||||||
},
|
|
||||||
"sidebar.selected.duplicate": {
|
|
||||||
priority: 100,
|
|
||||||
enable,
|
|
||||||
cb: async (items: TreeModel[]) => {
|
|
||||||
if (items.length === 1 && items[0]) {
|
|
||||||
const item = items[0];
|
|
||||||
const newId = await duplicateModel(item);
|
|
||||||
setSelectedEnvironmentId(newId);
|
|
||||||
} else {
|
|
||||||
await Promise.all(items.map(duplicateModel));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
} as const;
|
|
||||||
return actions;
|
|
||||||
}, [setSelectedEnvironmentId]);
|
|
||||||
|
|
||||||
const hotkeys = useMemo<TreeProps<TreeModel>["hotkeys"]>(() => ({ actions }), [actions]);
|
const handleRenameSelected = useCallback(() => {
|
||||||
|
const items = getSelectedTreeModels();
|
||||||
|
if (items?.length === 1 && items[0] != null) {
|
||||||
|
treeRef.current?.renameItem(items[0].id);
|
||||||
|
}
|
||||||
|
}, [getSelectedTreeModels]);
|
||||||
|
|
||||||
|
const handleDeleteSelected = useCallback(
|
||||||
|
(items: TreeModel[]) => deleteModelWithConfirm(items),
|
||||||
|
[],
|
||||||
|
);
|
||||||
|
|
||||||
|
const handleDuplicateSelected = useCallback(
|
||||||
|
async (items: TreeModel[]) => {
|
||||||
|
if (items.length === 1 && items[0]) {
|
||||||
|
const newId = await duplicateModel(items[0]);
|
||||||
|
setSelectedEnvironmentId(newId);
|
||||||
|
} else {
|
||||||
|
await Promise.all(items.map(duplicateModel));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[setSelectedEnvironmentId],
|
||||||
|
);
|
||||||
|
|
||||||
|
useHotKey("sidebar.selected.rename", handleRenameSelected, {
|
||||||
|
enable: treeHasFocus,
|
||||||
|
allowDefault: true,
|
||||||
|
priority: 100,
|
||||||
|
});
|
||||||
|
useHotKey(
|
||||||
|
"sidebar.selected.delete",
|
||||||
|
useCallback(() => {
|
||||||
|
const items = getSelectedTreeModels();
|
||||||
|
if (items) {
|
||||||
|
fireAndForget(handleDeleteSelected(items));
|
||||||
|
}
|
||||||
|
}, [getSelectedTreeModels, handleDeleteSelected]),
|
||||||
|
{ enable: treeHasFocus, priority: 100 },
|
||||||
|
);
|
||||||
|
useHotKey(
|
||||||
|
"sidebar.selected.duplicate",
|
||||||
|
useCallback(async () => {
|
||||||
|
const items = getSelectedTreeModels();
|
||||||
|
if (items) await handleDuplicateSelected(items);
|
||||||
|
}, [getSelectedTreeModels, handleDuplicateSelected]),
|
||||||
|
{ enable: treeHasFocus, priority: 100 },
|
||||||
|
);
|
||||||
|
|
||||||
const getContextMenu = useCallback(
|
const getContextMenu = useCallback(
|
||||||
(items: TreeModel[]): ContextMenuProps["items"] => {
|
(items: TreeModel[]): ContextMenuProps["items"] => {
|
||||||
@@ -196,12 +216,10 @@ function EnvironmentEditDialogSidebar({
|
|||||||
hidden: isBaseEnvironment(environment) || !singleEnvironment,
|
hidden: isBaseEnvironment(environment) || !singleEnvironment,
|
||||||
hotKeyAction: "sidebar.selected.rename",
|
hotKeyAction: "sidebar.selected.rename",
|
||||||
hotKeyLabelOnly: true,
|
hotKeyLabelOnly: true,
|
||||||
onSelect: async () => {
|
onSelect: () => {
|
||||||
// Not sure why this is needed, but without it the
|
// Not sure why this is needed, but without it the
|
||||||
// edit input blurs immediately after opening.
|
// edit input blurs immediately after opening.
|
||||||
requestAnimationFrame(() => {
|
requestAnimationFrame(() => handleRenameSelected());
|
||||||
fireAndForget(actions["sidebar.selected.rename"].cb(items));
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -210,7 +228,7 @@ function EnvironmentEditDialogSidebar({
|
|||||||
hidden: isBaseEnvironment(environment),
|
hidden: isBaseEnvironment(environment),
|
||||||
hotKeyAction: "sidebar.selected.duplicate",
|
hotKeyAction: "sidebar.selected.duplicate",
|
||||||
hotKeyLabelOnly: true,
|
hotKeyLabelOnly: true,
|
||||||
onSelect: () => actions["sidebar.selected.duplicate"].cb(items),
|
onSelect: () => handleDuplicateSelected(items),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: environment.color ? "Change Color" : "Assign Color",
|
label: environment.color ? "Change Color" : "Assign Color",
|
||||||
@@ -246,7 +264,12 @@ function EnvironmentEditDialogSidebar({
|
|||||||
|
|
||||||
return menuItems;
|
return menuItems;
|
||||||
},
|
},
|
||||||
[actions, baseEnvironments.length, handleDeleteEnvironment],
|
[
|
||||||
|
baseEnvironments.length,
|
||||||
|
handleDeleteEnvironment,
|
||||||
|
handleDuplicateSelected,
|
||||||
|
handleRenameSelected,
|
||||||
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
const handleDragEnd = useCallback(async function handleDragEnd({
|
const handleDragEnd = useCallback(async function handleDragEnd({
|
||||||
@@ -293,6 +316,13 @@ function EnvironmentEditDialogSidebar({
|
|||||||
[setSelectedEnvironmentId],
|
[setSelectedEnvironmentId],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const renderContextMenuFn = useCallback<NonNullable<TreeProps<TreeModel>["renderContextMenu"]>>(
|
||||||
|
({ items, position, onClose }) => (
|
||||||
|
<ContextMenu items={items as DropdownItem[]} triggerPosition={position} onClose={onClose} />
|
||||||
|
),
|
||||||
|
[],
|
||||||
|
);
|
||||||
|
|
||||||
const tree = useAtomValue(treeAtom);
|
const tree = useAtomValue(treeAtom);
|
||||||
return (
|
return (
|
||||||
<aside className="x-theme-sidebar h-full w-full min-w-0 grid overflow-y-auto border-r border-border-subtle ">
|
<aside className="x-theme-sidebar h-full w-full min-w-0 grid overflow-y-auto border-r border-border-subtle ">
|
||||||
@@ -301,10 +331,11 @@ function EnvironmentEditDialogSidebar({
|
|||||||
<Tree
|
<Tree
|
||||||
ref={treeRef}
|
ref={treeRef}
|
||||||
treeId={treeId}
|
treeId={treeId}
|
||||||
|
collapsedAtom={collapsedFamily(treeId)}
|
||||||
className="px-2 pb-10"
|
className="px-2 pb-10"
|
||||||
hotkeys={hotkeys}
|
|
||||||
root={tree}
|
root={tree}
|
||||||
getContextMenu={getContextMenu}
|
getContextMenu={getContextMenu}
|
||||||
|
renderContextMenu={renderContextMenuFn}
|
||||||
onDragEnd={handleDragEnd}
|
onDragEnd={handleDragEnd}
|
||||||
getItemKey={(i) => `${i.id}::${i.name}`}
|
getItemKey={(i) => `${i.id}::${i.name}`}
|
||||||
ItemLeftSlotInner={ItemLeftSlotInner}
|
ItemLeftSlotInner={ItemLeftSlotInner}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
import type { Environment } from "@yaakapp-internal/models";
|
import type { Environment } from "@yaakapp-internal/models";
|
||||||
import { patchModel } from "@yaakapp-internal/models";
|
import { patchModel } from "@yaakapp-internal/models";
|
||||||
import type { GenericCompletionOption } from "@yaakapp-internal/plugins";
|
import type { GenericCompletionOption } from "@yaakapp-internal/plugins";
|
||||||
|
import { Heading } from "@yaakapp-internal/ui";
|
||||||
import classNames from "classnames";
|
import classNames from "classnames";
|
||||||
import { useCallback, useMemo } from "react";
|
import { useCallback, useMemo } from "react";
|
||||||
import { useEnvironmentsBreakdown } from "../hooks/useEnvironmentsBreakdown";
|
import { useEnvironmentsBreakdown } from "../hooks/useEnvironmentsBreakdown";
|
||||||
@@ -15,7 +16,6 @@ import {
|
|||||||
} from "../lib/setupOrConfigureEncryption";
|
} from "../lib/setupOrConfigureEncryption";
|
||||||
import { DismissibleBanner } from "./core/DismissibleBanner";
|
import { DismissibleBanner } from "./core/DismissibleBanner";
|
||||||
import type { GenericCompletionConfig } from "./core/Editor/genericCompletion";
|
import type { GenericCompletionConfig } from "./core/Editor/genericCompletion";
|
||||||
import { Heading } from "./core/Heading";
|
|
||||||
import type { PairEditorHandle, PairWithId } from "./core/PairEditor";
|
import type { PairEditorHandle, PairWithId } from "./core/PairEditor";
|
||||||
import { ensurePairId } from "./core/PairEditor.util";
|
import { ensurePairId } from "./core/PairEditor.util";
|
||||||
import { PairOrBulkEditor } from "./core/PairOrBulkEditor";
|
import { PairOrBulkEditor } from "./core/PairOrBulkEditor";
|
||||||
@@ -1,9 +1,7 @@
|
|||||||
|
import { Banner, Button, InlineCode } from "@yaakapp-internal/ui";
|
||||||
import type { ErrorInfo, ReactNode } from "react";
|
import type { ErrorInfo, ReactNode } from "react";
|
||||||
import { Component, useEffect } from "react";
|
import { Component, useEffect } from "react";
|
||||||
import { showDialog } from "../lib/dialog";
|
import { showDialog } from "../lib/dialog";
|
||||||
import { Banner } from "./core/Banner";
|
|
||||||
import { Button } from "./core/Button";
|
|
||||||
import { InlineCode } from "./core/InlineCode";
|
|
||||||
import RouteError from "./RouteError";
|
import RouteError from "./RouteError";
|
||||||
|
|
||||||
interface ErrorBoundaryProps {
|
interface ErrorBoundaryProps {
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
import { save } from "@tauri-apps/plugin-dialog";
|
import { save } from "@tauri-apps/plugin-dialog";
|
||||||
import type { Workspace } from "@yaakapp-internal/models";
|
import type { Workspace } from "@yaakapp-internal/models";
|
||||||
import { workspacesAtom } from "@yaakapp-internal/models";
|
import { workspacesAtom } from "@yaakapp-internal/models";
|
||||||
|
import { HStack, VStack } from "@yaakapp-internal/ui";
|
||||||
import { useAtomValue } from "jotai";
|
import { useAtomValue } from "jotai";
|
||||||
import { useCallback, useMemo, useState } from "react";
|
import { useCallback, useMemo, useState } from "react";
|
||||||
import slugify from "slugify";
|
import slugify from "slugify";
|
||||||
@@ -11,7 +12,6 @@ import { Button } from "./core/Button";
|
|||||||
import { Checkbox } from "./core/Checkbox";
|
import { Checkbox } from "./core/Checkbox";
|
||||||
import { DetailsBanner } from "./core/DetailsBanner";
|
import { DetailsBanner } from "./core/DetailsBanner";
|
||||||
import { Link } from "./core/Link";
|
import { Link } from "./core/Link";
|
||||||
import { HStack, VStack } from "./core/Stacks";
|
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
onHide: () => void;
|
onHide: () => void;
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import type { Folder, GrpcRequest, HttpRequest, WebsocketRequest } from "@yaakapp-internal/models";
|
import type { Folder, GrpcRequest, HttpRequest, WebsocketRequest } from "@yaakapp-internal/models";
|
||||||
import { foldersAtom } from "@yaakapp-internal/models";
|
import { foldersAtom } from "@yaakapp-internal/models";
|
||||||
|
import { Heading, HStack, Icon, LoadingIcon } from "@yaakapp-internal/ui";
|
||||||
import classNames from "classnames";
|
import classNames from "classnames";
|
||||||
import { useAtomValue } from "jotai";
|
import { useAtomValue } from "jotai";
|
||||||
import type { CSSProperties, ReactNode } from "react";
|
import type { CSSProperties, ReactNode } from "react";
|
||||||
@@ -8,20 +9,15 @@ import { allRequestsAtom } from "../hooks/useAllRequests";
|
|||||||
import { useFolderActions } from "../hooks/useFolderActions";
|
import { useFolderActions } from "../hooks/useFolderActions";
|
||||||
import { useLatestHttpResponse } from "../hooks/useLatestHttpResponse";
|
import { useLatestHttpResponse } from "../hooks/useLatestHttpResponse";
|
||||||
import { sendAnyHttpRequest } from "../hooks/useSendAnyHttpRequest";
|
import { sendAnyHttpRequest } from "../hooks/useSendAnyHttpRequest";
|
||||||
import { fireAndForget } from "../lib/fireAndForget";
|
|
||||||
import { showDialog } from "../lib/dialog";
|
import { showDialog } from "../lib/dialog";
|
||||||
import { resolvedModelName } from "../lib/resolvedModelName";
|
import { resolvedModelName } from "../lib/resolvedModelName";
|
||||||
import { router } from "../lib/router";
|
import { router } from "../lib/router";
|
||||||
import { Button } from "./core/Button";
|
import { Button } from "./core/Button";
|
||||||
import { Heading } from "./core/Heading";
|
|
||||||
import { HttpResponseDurationTag } from "./core/HttpResponseDurationTag";
|
import { HttpResponseDurationTag } from "./core/HttpResponseDurationTag";
|
||||||
import { HttpStatusTag } from "./core/HttpStatusTag";
|
import { HttpStatusTag } from "./core/HttpStatusTag";
|
||||||
import { Icon } from "./core/Icon";
|
|
||||||
import { IconButton } from "./core/IconButton";
|
import { IconButton } from "./core/IconButton";
|
||||||
import { LoadingIcon } from "./core/LoadingIcon";
|
|
||||||
import { Separator } from "./core/Separator";
|
import { Separator } from "./core/Separator";
|
||||||
import { SizeTag } from "./core/SizeTag";
|
import { SizeTag } from "./core/SizeTag";
|
||||||
import { HStack } from "./core/Stacks";
|
|
||||||
import { HttpResponsePane } from "./HttpResponsePane";
|
import { HttpResponsePane } from "./HttpResponsePane";
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
@@ -46,7 +42,7 @@ export function FolderLayout({ folder, style }: Props) {
|
|||||||
}, [folder.id, folders, requests]);
|
}, [folder.id, folders, requests]);
|
||||||
|
|
||||||
const handleSendAll = useCallback(() => {
|
const handleSendAll = useCallback(() => {
|
||||||
if (sendAllAction) fireAndForget(sendAllAction.call(folder));
|
void sendAllAction?.call(folder);
|
||||||
}, [sendAllAction, folder]);
|
}, [sendAllAction, folder]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
import { createWorkspaceModel, foldersAtom, patchModel } from "@yaakapp-internal/models";
|
import { createWorkspaceModel, foldersAtom, patchModel } from "@yaakapp-internal/models";
|
||||||
|
import { HStack, Icon, InlineCode, VStack } from "@yaakapp-internal/ui";
|
||||||
import { useAtomValue } from "jotai";
|
import { useAtomValue } from "jotai";
|
||||||
import { Fragment, useMemo } from "react";
|
import { Fragment, useMemo } from "react";
|
||||||
import { useAuthTab } from "../hooks/useAuthTab";
|
import { useAuthTab } from "../hooks/useAuthTab";
|
||||||
@@ -11,11 +12,8 @@ import { hideDialog } from "../lib/dialog";
|
|||||||
import { CopyIconButton } from "./CopyIconButton";
|
import { CopyIconButton } from "./CopyIconButton";
|
||||||
import { Button } from "./core/Button";
|
import { Button } from "./core/Button";
|
||||||
import { CountBadge } from "./core/CountBadge";
|
import { CountBadge } from "./core/CountBadge";
|
||||||
import { Icon } from "./core/Icon";
|
|
||||||
import { InlineCode } from "./core/InlineCode";
|
|
||||||
import { Input } from "./core/Input";
|
import { Input } from "./core/Input";
|
||||||
import { Link } from "./core/Link";
|
import { Link } from "./core/Link";
|
||||||
import { HStack, VStack } from "./core/Stacks";
|
|
||||||
import type { TabItem } from "./core/Tabs/Tabs";
|
import type { TabItem } from "./core/Tabs/Tabs";
|
||||||
import { TabContent, Tabs } from "./core/Tabs/Tabs";
|
import { TabContent, Tabs } from "./core/Tabs/Tabs";
|
||||||
import { EmptyStateText } from "./EmptyStateText";
|
import { EmptyStateText } from "./EmptyStateText";
|
||||||
@@ -7,10 +7,10 @@ import { useActiveRequest } from "../hooks/useActiveRequest";
|
|||||||
import { useGrpc } from "../hooks/useGrpc";
|
import { useGrpc } from "../hooks/useGrpc";
|
||||||
import { useGrpcProtoFiles } from "../hooks/useGrpcProtoFiles";
|
import { useGrpcProtoFiles } from "../hooks/useGrpcProtoFiles";
|
||||||
import { activeGrpcConnectionAtom, useGrpcEvents } from "../hooks/usePinnedGrpcConnection";
|
import { activeGrpcConnectionAtom, useGrpcEvents } from "../hooks/usePinnedGrpcConnection";
|
||||||
|
import { Banner, SplitLayout } from "@yaakapp-internal/ui";
|
||||||
|
import { activeWorkspaceAtom } from "../hooks/useActiveWorkspace";
|
||||||
import { workspaceLayoutAtom } from "../lib/atoms";
|
import { workspaceLayoutAtom } from "../lib/atoms";
|
||||||
import { Banner } from "./core/Banner";
|
|
||||||
import { HotkeyList } from "./core/HotkeyList";
|
import { HotkeyList } from "./core/HotkeyList";
|
||||||
import { SplitLayout } from "./core/SplitLayout";
|
|
||||||
import { GrpcRequestPane } from "./GrpcRequestPane";
|
import { GrpcRequestPane } from "./GrpcRequestPane";
|
||||||
import { GrpcResponsePane } from "./GrpcResponsePane";
|
import { GrpcResponsePane } from "./GrpcResponsePane";
|
||||||
|
|
||||||
@@ -22,6 +22,8 @@ const emptyArray: string[] = [];
|
|||||||
|
|
||||||
export function GrpcConnectionLayout({ style }: Props) {
|
export function GrpcConnectionLayout({ style }: Props) {
|
||||||
const workspaceLayout = useAtomValue(workspaceLayoutAtom);
|
const workspaceLayout = useAtomValue(workspaceLayoutAtom);
|
||||||
|
const activeWorkspace = useAtomValue(activeWorkspaceAtom);
|
||||||
|
const wsId = activeWorkspace?.id ?? "n/a";
|
||||||
const activeRequest = useActiveRequest("grpc_request");
|
const activeRequest = useActiveRequest("grpc_request");
|
||||||
const activeConnection = useAtomValue(activeGrpcConnectionAtom);
|
const activeConnection = useAtomValue(activeGrpcConnectionAtom);
|
||||||
const grpcEvents = useGrpcEvents(activeConnection?.id ?? null);
|
const grpcEvents = useGrpcEvents(activeConnection?.id ?? null);
|
||||||
@@ -79,7 +81,7 @@ export function GrpcConnectionLayout({ style }: Props) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<SplitLayout
|
<SplitLayout
|
||||||
name="grpc_layout"
|
storageKey={`grpc_layout::${wsId}`}
|
||||||
className="p-3 gap-1.5"
|
className="p-3 gap-1.5"
|
||||||
style={style}
|
style={style}
|
||||||
layout={workspaceLayout}
|
layout={workspaceLayout}
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
import { jsoncLanguage } from "@shopify/lang-jsonc";
|
|
||||||
import { linter } from "@codemirror/lint";
|
import { linter } from "@codemirror/lint";
|
||||||
import type { EditorView } from "@codemirror/view";
|
import type { EditorView } from "@codemirror/view";
|
||||||
|
import { jsoncLanguage } from "@shopify/lang-jsonc";
|
||||||
import type { GrpcRequest } from "@yaakapp-internal/models";
|
import type { GrpcRequest } from "@yaakapp-internal/models";
|
||||||
|
import { FormattedError, InlineCode, VStack } from "@yaakapp-internal/ui";
|
||||||
import classNames from "classnames";
|
import classNames from "classnames";
|
||||||
import {
|
import {
|
||||||
handleRefresh,
|
handleRefresh,
|
||||||
@@ -18,9 +19,6 @@ import { pluralizeCount } from "../lib/pluralize";
|
|||||||
import { Button } from "./core/Button";
|
import { Button } from "./core/Button";
|
||||||
import type { EditorProps } from "./core/Editor/Editor";
|
import type { EditorProps } from "./core/Editor/Editor";
|
||||||
import { Editor } from "./core/Editor/LazyEditor";
|
import { Editor } from "./core/Editor/LazyEditor";
|
||||||
import { FormattedError } from "./core/FormattedError";
|
|
||||||
import { InlineCode } from "./core/InlineCode";
|
|
||||||
import { VStack } from "./core/Stacks";
|
|
||||||
import { GrpcProtoSelectionDialog } from "./GrpcProtoSelectionDialog";
|
import { GrpcProtoSelectionDialog } from "./GrpcProtoSelectionDialog";
|
||||||
|
|
||||||
type Props = Pick<EditorProps, "heightMode" | "onChange" | "className" | "forceUpdateKey"> & {
|
type Props = Pick<EditorProps, "heightMode" | "onChange" | "className" | "forceUpdateKey"> & {
|
||||||
@@ -1,16 +1,13 @@
|
|||||||
import { open } from "@tauri-apps/plugin-dialog";
|
import { open } from "@tauri-apps/plugin-dialog";
|
||||||
import type { GrpcRequest } from "@yaakapp-internal/models";
|
import type { GrpcRequest } from "@yaakapp-internal/models";
|
||||||
|
import { Banner, HStack, Icon, InlineCode, VStack } from "@yaakapp-internal/ui";
|
||||||
import { useActiveRequest } from "../hooks/useActiveRequest";
|
import { useActiveRequest } from "../hooks/useActiveRequest";
|
||||||
import { useGrpc } from "../hooks/useGrpc";
|
import { useGrpc } from "../hooks/useGrpc";
|
||||||
import { useGrpcProtoFiles } from "../hooks/useGrpcProtoFiles";
|
import { useGrpcProtoFiles } from "../hooks/useGrpcProtoFiles";
|
||||||
import { pluralizeCount } from "../lib/pluralize";
|
import { pluralizeCount } from "../lib/pluralize";
|
||||||
import { Banner } from "./core/Banner";
|
|
||||||
import { Button } from "./core/Button";
|
import { Button } from "./core/Button";
|
||||||
import { Icon } from "./core/Icon";
|
|
||||||
import { IconButton } from "./core/IconButton";
|
import { IconButton } from "./core/IconButton";
|
||||||
import { InlineCode } from "./core/InlineCode";
|
|
||||||
import { Link } from "./core/Link";
|
import { Link } from "./core/Link";
|
||||||
import { HStack, VStack } from "./core/Stacks";
|
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
onDone: () => void;
|
onDone: () => void;
|
||||||
@@ -30,7 +27,7 @@ function GrpcProtoSelectionDialogWithRequest({ request }: Props & { request: Grp
|
|||||||
const services = grpc.reflect.data;
|
const services = grpc.reflect.data;
|
||||||
const serverReflection = protoFiles.length === 0 && services != null;
|
const serverReflection = protoFiles.length === 0 && services != null;
|
||||||
let reflectError = grpc.reflect.error ?? null;
|
let reflectError = grpc.reflect.error ?? null;
|
||||||
const reflectionUnimplemented = `${reflectError}`.match(/unimplemented/i);
|
const reflectionUnimplemented = String(reflectError).match(/unimplemented/i);
|
||||||
|
|
||||||
if (reflectionUnimplemented) {
|
if (reflectionUnimplemented) {
|
||||||
reflectError = null;
|
reflectError = null;
|
||||||
@@ -143,8 +140,8 @@ function GrpcProtoSelectionDialogWithRequest({ request }: Props & { request: Grp
|
|||||||
<tbody className="divide-y divide-surface-highlight">
|
<tbody className="divide-y divide-surface-highlight">
|
||||||
{protoFiles.map((f, i) => {
|
{protoFiles.map((f, i) => {
|
||||||
const parts = f.split("/");
|
const parts = f.split("/");
|
||||||
|
// oxlint-disable-next-line no-array-index-key -- none
|
||||||
return (
|
return (
|
||||||
// oxlint-disable-next-line react/no-array-index-key
|
|
||||||
<tr key={f + i} className="group">
|
<tr key={f + i} className="group">
|
||||||
<td>
|
<td>
|
||||||
<Icon icon={f.endsWith(".proto") ? "file_code" : "folder_code"} />
|
<Icon icon={f.endsWith(".proto") ? "file_code" : "folder_code"} />
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
import { type GrpcRequest, type HttpRequestHeader, patchModel } from "@yaakapp-internal/models";
|
import { type GrpcRequest, type HttpRequestHeader, patchModel } from "@yaakapp-internal/models";
|
||||||
|
import { HStack, Icon, useContainerSize, VStack } from "@yaakapp-internal/ui";
|
||||||
import classNames from "classnames";
|
import classNames from "classnames";
|
||||||
import type { CSSProperties } from "react";
|
import type { CSSProperties } from "react";
|
||||||
import { useCallback, useMemo, useRef } from "react";
|
import { useCallback, useMemo, useRef } from "react";
|
||||||
import { useAuthTab } from "../hooks/useAuthTab";
|
import { useAuthTab } from "../hooks/useAuthTab";
|
||||||
import { useContainerSize } from "../hooks/useContainerQuery";
|
|
||||||
import type { ReflectResponseService } from "../hooks/useGrpc";
|
import type { ReflectResponseService } from "../hooks/useGrpc";
|
||||||
import { useHeadersTab } from "../hooks/useHeadersTab";
|
import { useHeadersTab } from "../hooks/useHeadersTab";
|
||||||
import { useInheritedHeaders } from "../hooks/useInheritedHeaders";
|
import { useInheritedHeaders } from "../hooks/useInheritedHeaders";
|
||||||
@@ -11,11 +11,9 @@ import { useRequestUpdateKey } from "../hooks/useRequestUpdateKey";
|
|||||||
import { resolvedModelName } from "../lib/resolvedModelName";
|
import { resolvedModelName } from "../lib/resolvedModelName";
|
||||||
import { Button } from "./core/Button";
|
import { Button } from "./core/Button";
|
||||||
import { CountBadge } from "./core/CountBadge";
|
import { CountBadge } from "./core/CountBadge";
|
||||||
import { Icon } from "./core/Icon";
|
|
||||||
import { IconButton } from "./core/IconButton";
|
import { IconButton } from "./core/IconButton";
|
||||||
import { PlainInput } from "./core/PlainInput";
|
import { PlainInput } from "./core/PlainInput";
|
||||||
import { RadioDropdown } from "./core/RadioDropdown";
|
import { RadioDropdown } from "./core/RadioDropdown";
|
||||||
import { HStack, VStack } from "./core/Stacks";
|
|
||||||
import type { TabItem } from "./core/Tabs/Tabs";
|
import type { TabItem } from "./core/Tabs/Tabs";
|
||||||
import { TabContent, Tabs } from "./core/Tabs/Tabs";
|
import { TabContent, Tabs } from "./core/Tabs/Tabs";
|
||||||
import { GrpcEditor } from "./GrpcEditor";
|
import { GrpcEditor } from "./GrpcEditor";
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
import type { GrpcEvent, GrpcRequest } from "@yaakapp-internal/models";
|
import type { GrpcEvent, GrpcRequest } from "@yaakapp-internal/models";
|
||||||
|
import { HStack, Icon, type IconProps, LoadingIcon, VStack } from "@yaakapp-internal/ui";
|
||||||
import { useAtomValue, useSetAtom } from "jotai";
|
import { useAtomValue, useSetAtom } from "jotai";
|
||||||
import type { CSSProperties } from "react";
|
import type { CSSProperties } from "react";
|
||||||
import { useEffect, useMemo, useState } from "react";
|
import { useEffect, useMemo, useState } from "react";
|
||||||
@@ -14,10 +15,7 @@ import { Editor } from "./core/Editor/LazyEditor";
|
|||||||
import { EventDetailHeader, EventViewer } from "./core/EventViewer";
|
import { EventDetailHeader, EventViewer } from "./core/EventViewer";
|
||||||
import { EventViewerRow } from "./core/EventViewerRow";
|
import { EventViewerRow } from "./core/EventViewerRow";
|
||||||
import { HotkeyList } from "./core/HotkeyList";
|
import { HotkeyList } from "./core/HotkeyList";
|
||||||
import { Icon, type IconProps } from "./core/Icon";
|
|
||||||
import { KeyValueRow, KeyValueRows } from "./core/KeyValueRow";
|
import { KeyValueRow, KeyValueRows } from "./core/KeyValueRow";
|
||||||
import { LoadingIcon } from "./core/LoadingIcon";
|
|
||||||
import { HStack, VStack } from "./core/Stacks";
|
|
||||||
import { EmptyStateText } from "./EmptyStateText";
|
import { EmptyStateText } from "./EmptyStateText";
|
||||||
import { ErrorBoundary } from "./ErrorBoundary";
|
import { ErrorBoundary } from "./ErrorBoundary";
|
||||||
import { RecentGrpcConnectionsDropdown } from "./RecentGrpcConnectionsDropdown";
|
import { RecentGrpcConnectionsDropdown } from "./RecentGrpcConnectionsDropdown";
|
||||||
@@ -93,7 +91,7 @@ export function GrpcResponsePane({ style, methodType, activeRequest }: Props) {
|
|||||||
getEventKey={(event) => event.id}
|
getEventKey={(event) => event.id}
|
||||||
error={activeConnection.error}
|
error={activeConnection.error}
|
||||||
header={header}
|
header={header}
|
||||||
splitLayoutName="grpc_events"
|
splitLayoutStorageKey="grpc_events"
|
||||||
defaultRatio={0.4}
|
defaultRatio={0.4}
|
||||||
renderRow={({ event, isActive, onClick }) => (
|
renderRow={({ event, isActive, onClick }) => (
|
||||||
<GrpcEventRow event={event} isActive={isActive} onClick={onClick} />
|
<GrpcEventRow event={event} isActive={isActive} onClick={onClick} />
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import type { HttpRequestHeader } from "@yaakapp-internal/models";
|
import type { HttpRequestHeader } from "@yaakapp-internal/models";
|
||||||
import type { GenericCompletionOption } from "@yaakapp-internal/plugins";
|
import type { GenericCompletionOption } from "@yaakapp-internal/plugins";
|
||||||
|
import { HStack } from "@yaakapp-internal/ui";
|
||||||
import { charsets } from "../lib/data/charsets";
|
import { charsets } from "../lib/data/charsets";
|
||||||
import { connections } from "../lib/data/connections";
|
import { connections } from "../lib/data/connections";
|
||||||
import { encodings } from "../lib/data/encodings";
|
import { encodings } from "../lib/data/encodings";
|
||||||
@@ -13,7 +14,6 @@ import type { Pair, PairEditorProps } from "./core/PairEditor";
|
|||||||
import { PairEditorRow } from "./core/PairEditor";
|
import { PairEditorRow } from "./core/PairEditor";
|
||||||
import { ensurePairId } from "./core/PairEditor.util";
|
import { ensurePairId } from "./core/PairEditor.util";
|
||||||
import { PairOrBulkEditor } from "./core/PairOrBulkEditor";
|
import { PairOrBulkEditor } from "./core/PairOrBulkEditor";
|
||||||
import { HStack } from "./core/Stacks";
|
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
forceUpdateKey: string;
|
forceUpdateKey: string;
|
||||||
@@ -6,6 +6,7 @@ import type {
|
|||||||
Workspace,
|
Workspace,
|
||||||
} from "@yaakapp-internal/models";
|
} from "@yaakapp-internal/models";
|
||||||
import { patchModel } from "@yaakapp-internal/models";
|
import { patchModel } from "@yaakapp-internal/models";
|
||||||
|
import { HStack, Icon, InlineCode } from "@yaakapp-internal/ui";
|
||||||
import { useCallback } from "react";
|
import { useCallback } from "react";
|
||||||
import { openFolderSettings } from "../commands/openFolderSettings";
|
import { openFolderSettings } from "../commands/openFolderSettings";
|
||||||
import { openWorkspaceSettings } from "../commands/openWorkspaceSettings";
|
import { openWorkspaceSettings } from "../commands/openWorkspaceSettings";
|
||||||
@@ -14,13 +15,10 @@ import { useInheritedAuthentication } from "../hooks/useInheritedAuthentication"
|
|||||||
import { useRenderTemplate } from "../hooks/useRenderTemplate";
|
import { useRenderTemplate } from "../hooks/useRenderTemplate";
|
||||||
import { resolvedModelName } from "../lib/resolvedModelName";
|
import { resolvedModelName } from "../lib/resolvedModelName";
|
||||||
import { Dropdown, type DropdownItem } from "./core/Dropdown";
|
import { Dropdown, type DropdownItem } from "./core/Dropdown";
|
||||||
import { Icon } from "./core/Icon";
|
|
||||||
import { IconButton } from "./core/IconButton";
|
import { IconButton } from "./core/IconButton";
|
||||||
import { InlineCode } from "./core/InlineCode";
|
|
||||||
import { Input, type InputProps } from "./core/Input";
|
import { Input, type InputProps } from "./core/Input";
|
||||||
import { Link } from "./core/Link";
|
import { Link } from "./core/Link";
|
||||||
import { SegmentedControl } from "./core/SegmentedControl";
|
import { SegmentedControl } from "./core/SegmentedControl";
|
||||||
import { HStack } from "./core/Stacks";
|
|
||||||
import { DynamicForm } from "./DynamicForm";
|
import { DynamicForm } from "./DynamicForm";
|
||||||
import { EmptyStateText } from "./EmptyStateText";
|
import { EmptyStateText } from "./EmptyStateText";
|
||||||
|
|
||||||
@@ -1,11 +1,12 @@
|
|||||||
import type { HttpRequest } from "@yaakapp-internal/models";
|
import type { HttpRequest } from "@yaakapp-internal/models";
|
||||||
|
import type { SlotProps } from "@yaakapp-internal/ui";
|
||||||
|
import { SplitLayout } from "@yaakapp-internal/ui";
|
||||||
import classNames from "classnames";
|
import classNames from "classnames";
|
||||||
import { useAtomValue } from "jotai";
|
import { useAtomValue } from "jotai";
|
||||||
import type { CSSProperties } from "react";
|
import type { CSSProperties } from "react";
|
||||||
import { useCurrentGraphQLSchema } from "../hooks/useIntrospectGraphQL";
|
import { useCurrentGraphQLSchema } from "../hooks/useIntrospectGraphQL";
|
||||||
|
import { activeWorkspaceAtom } from "../hooks/useActiveWorkspace";
|
||||||
import { workspaceLayoutAtom } from "../lib/atoms";
|
import { workspaceLayoutAtom } from "../lib/atoms";
|
||||||
import type { SlotProps } from "./core/SplitLayout";
|
|
||||||
import { SplitLayout } from "./core/SplitLayout";
|
|
||||||
import { GraphQLDocsExplorer } from "./graphql/GraphQLDocsExplorer";
|
import { GraphQLDocsExplorer } from "./graphql/GraphQLDocsExplorer";
|
||||||
import { showGraphQLDocExplorerAtom } from "./graphql/graphqlAtoms";
|
import { showGraphQLDocExplorerAtom } from "./graphql/graphqlAtoms";
|
||||||
import { HttpRequestPane } from "./HttpRequestPane";
|
import { HttpRequestPane } from "./HttpRequestPane";
|
||||||
@@ -20,10 +21,12 @@ export function HttpRequestLayout({ activeRequest, style }: Props) {
|
|||||||
const showGraphQLDocExplorer = useAtomValue(showGraphQLDocExplorerAtom);
|
const showGraphQLDocExplorer = useAtomValue(showGraphQLDocExplorerAtom);
|
||||||
const graphQLSchema = useCurrentGraphQLSchema(activeRequest);
|
const graphQLSchema = useCurrentGraphQLSchema(activeRequest);
|
||||||
const workspaceLayout = useAtomValue(workspaceLayoutAtom);
|
const workspaceLayout = useAtomValue(workspaceLayoutAtom);
|
||||||
|
const activeWorkspace = useAtomValue(activeWorkspaceAtom);
|
||||||
|
const wsId = activeWorkspace?.id ?? "n/a";
|
||||||
|
|
||||||
const requestResponseSplit = ({ style }: Pick<SlotProps, "style">) => (
|
const requestResponseSplit = ({ style }: Pick<SlotProps, "style">) => (
|
||||||
<SplitLayout
|
<SplitLayout
|
||||||
name="http_layout"
|
storageKey={`http_layout::${wsId}`}
|
||||||
className="p-3 gap-1.5"
|
className="p-3 gap-1.5"
|
||||||
style={style}
|
style={style}
|
||||||
layout={workspaceLayout}
|
layout={workspaceLayout}
|
||||||
@@ -47,7 +50,7 @@ export function HttpRequestLayout({ activeRequest, style }: Props) {
|
|||||||
) {
|
) {
|
||||||
return (
|
return (
|
||||||
<SplitLayout
|
<SplitLayout
|
||||||
name="graphql_layout"
|
storageKey={`graphql_layout::${wsId}`}
|
||||||
defaultRatio={1 / 3}
|
defaultRatio={1 / 3}
|
||||||
firstSlot={requestResponseSplit}
|
firstSlot={requestResponseSplit}
|
||||||
secondSlot={({ style, orientation }) => (
|
secondSlot={({ style, orientation }) => (
|
||||||
@@ -38,7 +38,7 @@ import { ConfirmLargeRequestBody } from "./ConfirmLargeRequestBody";
|
|||||||
import { CountBadge } from "./core/CountBadge";
|
import { CountBadge } from "./core/CountBadge";
|
||||||
import type { GenericCompletionConfig } from "./core/Editor/genericCompletion";
|
import type { GenericCompletionConfig } from "./core/Editor/genericCompletion";
|
||||||
import { Editor } from "./core/Editor/LazyEditor";
|
import { Editor } from "./core/Editor/LazyEditor";
|
||||||
import { InlineCode } from "./core/InlineCode";
|
import { InlineCode } from "@yaakapp-internal/ui";
|
||||||
import type { Pair } from "./core/PairEditor";
|
import type { Pair } from "./core/PairEditor";
|
||||||
import { PlainInput } from "./core/PlainInput";
|
import { PlainInput } from "./core/PlainInput";
|
||||||
import type { TabItem, TabsRef } from "./core/Tabs/Tabs";
|
import type { TabItem, TabsRef } from "./core/Tabs/Tabs";
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
import type { HttpResponse, HttpResponseEvent } from "@yaakapp-internal/models";
|
import type { HttpResponse, HttpResponseEvent } from "@yaakapp-internal/models";
|
||||||
|
import { Banner, HStack, Icon, LoadingIcon, VStack } from "@yaakapp-internal/ui";
|
||||||
import classNames from "classnames";
|
import classNames from "classnames";
|
||||||
import type { ComponentType, CSSProperties } from "react";
|
import type { ComponentType, CSSProperties } from "react";
|
||||||
import { lazy, Suspense, useMemo } from "react";
|
import { lazy, Suspense, useMemo } from "react";
|
||||||
@@ -12,17 +13,13 @@ import { getMimeTypeFromContentType } from "../lib/contentType";
|
|||||||
import { getContentTypeFromHeaders, getCookieCounts } from "../lib/model_util";
|
import { getContentTypeFromHeaders, getCookieCounts } from "../lib/model_util";
|
||||||
import { ConfirmLargeResponse } from "./ConfirmLargeResponse";
|
import { ConfirmLargeResponse } from "./ConfirmLargeResponse";
|
||||||
import { ConfirmLargeResponseRequest } from "./ConfirmLargeResponseRequest";
|
import { ConfirmLargeResponseRequest } from "./ConfirmLargeResponseRequest";
|
||||||
import { Banner } from "./core/Banner";
|
|
||||||
import { Button } from "./core/Button";
|
import { Button } from "./core/Button";
|
||||||
import { CountBadge } from "./core/CountBadge";
|
import { CountBadge } from "./core/CountBadge";
|
||||||
import { HotkeyList } from "./core/HotkeyList";
|
import { HotkeyList } from "./core/HotkeyList";
|
||||||
import { HttpResponseDurationTag } from "./core/HttpResponseDurationTag";
|
import { HttpResponseDurationTag } from "./core/HttpResponseDurationTag";
|
||||||
import { HttpStatusTag } from "./core/HttpStatusTag";
|
import { HttpStatusTag } from "./core/HttpStatusTag";
|
||||||
import { Icon } from "./core/Icon";
|
|
||||||
import { LoadingIcon } from "./core/LoadingIcon";
|
|
||||||
import { PillButton } from "./core/PillButton";
|
import { PillButton } from "./core/PillButton";
|
||||||
import { SizeTag } from "./core/SizeTag";
|
import { SizeTag } from "./core/SizeTag";
|
||||||
import { HStack, VStack } from "./core/Stacks";
|
|
||||||
import type { TabItem } from "./core/Tabs/Tabs";
|
import type { TabItem } from "./core/Tabs/Tabs";
|
||||||
import { TabContent, Tabs } from "./core/Tabs/Tabs";
|
import { TabContent, Tabs } from "./core/Tabs/Tabs";
|
||||||
import { Tooltip } from "./core/Tooltip";
|
import { Tooltip } from "./core/Tooltip";
|
||||||
@@ -9,7 +9,7 @@ import { Editor } from "./core/Editor/LazyEditor";
|
|||||||
import { type EventDetailAction, EventDetailHeader, EventViewer } from "./core/EventViewer";
|
import { type EventDetailAction, EventDetailHeader, EventViewer } from "./core/EventViewer";
|
||||||
import { EventViewerRow } from "./core/EventViewerRow";
|
import { EventViewerRow } from "./core/EventViewerRow";
|
||||||
import { HttpStatusTagRaw } from "./core/HttpStatusTag";
|
import { HttpStatusTagRaw } from "./core/HttpStatusTag";
|
||||||
import { Icon, type IconProps } from "./core/Icon";
|
import { Icon, type IconProps } from "@yaakapp-internal/ui";
|
||||||
import { KeyValueRow, KeyValueRows } from "./core/KeyValueRow";
|
import { KeyValueRow, KeyValueRows } from "./core/KeyValueRow";
|
||||||
import type { TimelineViewMode } from "./HttpResponsePane";
|
import type { TimelineViewMode } from "./HttpResponsePane";
|
||||||
|
|
||||||
@@ -55,7 +55,7 @@ function Inner({ response, viewMode }: Props) {
|
|||||||
isLoading={isLoading}
|
isLoading={isLoading}
|
||||||
loadingMessage="Loading events..."
|
loadingMessage="Loading events..."
|
||||||
emptyMessage="No events recorded"
|
emptyMessage="No events recorded"
|
||||||
splitLayoutName="http_response_events"
|
splitLayoutStorageKey="http_response_events"
|
||||||
defaultRatio={0.25}
|
defaultRatio={0.25}
|
||||||
renderRow={({ event, isActive, onClick }) => {
|
renderRow={({ event, isActive, onClick }) => {
|
||||||
const display = getEventDisplay(event.event);
|
const display = getEventDisplay(event.event);
|
||||||
@@ -4,7 +4,7 @@ import { useEffect, useState } from "react";
|
|||||||
import { useImportCurl } from "../hooks/useImportCurl";
|
import { useImportCurl } from "../hooks/useImportCurl";
|
||||||
import { useWindowFocus } from "../hooks/useWindowFocus";
|
import { useWindowFocus } from "../hooks/useWindowFocus";
|
||||||
import { Button } from "./core/Button";
|
import { Button } from "./core/Button";
|
||||||
import { Icon } from "./core/Icon";
|
import { Icon } from "@yaakapp-internal/ui";
|
||||||
|
|
||||||
export function ImportCurlButton() {
|
export function ImportCurlButton() {
|
||||||
const focused = useWindowFocus();
|
const focused = useWindowFocus();
|
||||||
@@ -13,11 +13,9 @@ export function ImportCurlButton() {
|
|||||||
const importCurl = useImportCurl();
|
const importCurl = useImportCurl();
|
||||||
const [isLoading, setIsLoading] = useState(false);
|
const [isLoading, setIsLoading] = useState(false);
|
||||||
|
|
||||||
// oxlint-disable-next-line react-hooks/exhaustive-deps
|
// oxlint-disable-next-line react-hooks/exhaustive-deps -- none
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
readText()
|
void readText().then(setClipboardText);
|
||||||
.then(setClipboardText)
|
|
||||||
.catch(() => {});
|
|
||||||
}, [focused]);
|
}, [focused]);
|
||||||
|
|
||||||
if (!clipboardText?.trim().startsWith("curl ")) {
|
if (!clipboardText?.trim().startsWith("curl ")) {
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
|
import { VStack } from "@yaakapp-internal/ui";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { useLocalStorage } from "react-use";
|
import { useLocalStorage } from "react-use";
|
||||||
import { Button } from "./core/Button";
|
import { Button } from "./core/Button";
|
||||||
import { VStack } from "./core/Stacks";
|
|
||||||
import { SelectFile } from "./SelectFile";
|
import { SelectFile } from "./SelectFile";
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
@@ -1,17 +1,16 @@
|
|||||||
import { linter } from "@codemirror/lint";
|
import { linter } from "@codemirror/lint";
|
||||||
import type { HttpRequest } from "@yaakapp-internal/models";
|
import type { HttpRequest } from "@yaakapp-internal/models";
|
||||||
import { patchModel } from "@yaakapp-internal/models";
|
import { patchModel } from "@yaakapp-internal/models";
|
||||||
|
import { Banner, Icon } from "@yaakapp-internal/ui";
|
||||||
import { useCallback, useMemo } from "react";
|
import { useCallback, useMemo } from "react";
|
||||||
import { fireAndForget } from "../lib/fireAndForget";
|
|
||||||
import { useKeyValue } from "../hooks/useKeyValue";
|
import { useKeyValue } from "../hooks/useKeyValue";
|
||||||
|
import { fireAndForget } from "../lib/fireAndForget";
|
||||||
import { textLikelyContainsJsonComments } from "../lib/jsonComments";
|
import { textLikelyContainsJsonComments } from "../lib/jsonComments";
|
||||||
import { Banner } from "./core/Banner";
|
|
||||||
import type { DropdownItem } from "./core/Dropdown";
|
import type { DropdownItem } from "./core/Dropdown";
|
||||||
import { Dropdown } from "./core/Dropdown";
|
import { Dropdown } from "./core/Dropdown";
|
||||||
import type { EditorProps } from "./core/Editor/Editor";
|
import type { EditorProps } from "./core/Editor/Editor";
|
||||||
import { jsonParseLinter } from "./core/Editor/json-lint";
|
import { jsonParseLinter } from "./core/Editor/json-lint";
|
||||||
import { Editor } from "./core/Editor/LazyEditor";
|
import { Editor } from "./core/Editor/LazyEditor";
|
||||||
import { Icon } from "./core/Icon";
|
|
||||||
import { IconButton } from "./core/IconButton";
|
import { IconButton } from "./core/IconButton";
|
||||||
import { IconTooltip } from "./core/IconTooltip";
|
import { IconTooltip } from "./core/IconTooltip";
|
||||||
|
|
||||||
@@ -12,7 +12,7 @@ import { jotaiStore } from "../lib/jotai";
|
|||||||
import { CargoFeature } from "./CargoFeature";
|
import { CargoFeature } from "./CargoFeature";
|
||||||
import type { ButtonProps } from "./core/Button";
|
import type { ButtonProps } from "./core/Button";
|
||||||
import { Dropdown, type DropdownItem } from "./core/Dropdown";
|
import { Dropdown, type DropdownItem } from "./core/Dropdown";
|
||||||
import { Icon } from "./core/Icon";
|
import { Icon } from "@yaakapp-internal/ui";
|
||||||
import { PillButton } from "./core/PillButton";
|
import { PillButton } from "./core/PillButton";
|
||||||
|
|
||||||
const dismissedAtom = atomWithKVStorage<string | null>("dismissed_license_expired", null);
|
const dismissedAtom = atomWithKVStorage<string | null>("dismissed_license_expired", null);
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import type { GrpcRequest, HttpRequest, WebsocketRequest } from "@yaakapp-internal/models";
|
import type { GrpcRequest, HttpRequest, WebsocketRequest } from "@yaakapp-internal/models";
|
||||||
import { patchModel, workspacesAtom } from "@yaakapp-internal/models";
|
import { patchModel, workspacesAtom } from "@yaakapp-internal/models";
|
||||||
|
import { InlineCode, VStack } from "@yaakapp-internal/ui";
|
||||||
import { useAtomValue } from "jotai";
|
import { useAtomValue } from "jotai";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { pluralizeCount } from "../lib/pluralize";
|
import { pluralizeCount } from "../lib/pluralize";
|
||||||
@@ -7,9 +8,7 @@ import { resolvedModelName } from "../lib/resolvedModelName";
|
|||||||
import { router } from "../lib/router";
|
import { router } from "../lib/router";
|
||||||
import { showToast } from "../lib/toast";
|
import { showToast } from "../lib/toast";
|
||||||
import { Button } from "./core/Button";
|
import { Button } from "./core/Button";
|
||||||
import { InlineCode } from "./core/InlineCode";
|
|
||||||
import { Select } from "./core/Select";
|
import { Select } from "./core/Select";
|
||||||
import { VStack } from "./core/Stacks";
|
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
activeWorkspaceId: string;
|
activeWorkspaceId: string;
|
||||||
@@ -1,12 +1,11 @@
|
|||||||
import type { GrpcConnection } from "@yaakapp-internal/models";
|
import type { GrpcConnection } from "@yaakapp-internal/models";
|
||||||
import { deleteModel } from "@yaakapp-internal/models";
|
import { deleteModel } from "@yaakapp-internal/models";
|
||||||
|
import { HStack, Icon } from "@yaakapp-internal/ui";
|
||||||
import { formatDistanceToNowStrict } from "date-fns";
|
import { formatDistanceToNowStrict } from "date-fns";
|
||||||
import { useDeleteGrpcConnections } from "../hooks/useDeleteGrpcConnections";
|
import { useDeleteGrpcConnections } from "../hooks/useDeleteGrpcConnections";
|
||||||
import { pluralizeCount } from "../lib/pluralize";
|
import { pluralizeCount } from "../lib/pluralize";
|
||||||
import { Dropdown } from "./core/Dropdown";
|
import { Dropdown } from "./core/Dropdown";
|
||||||
import { Icon } from "./core/Icon";
|
|
||||||
import { IconButton } from "./core/IconButton";
|
import { IconButton } from "./core/IconButton";
|
||||||
import { HStack } from "./core/Stacks";
|
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
connections: GrpcConnection[];
|
connections: GrpcConnection[];
|
||||||
@@ -1,14 +1,13 @@
|
|||||||
import type { HttpResponse } from "@yaakapp-internal/models";
|
import type { HttpResponse } from "@yaakapp-internal/models";
|
||||||
import { deleteModel } from "@yaakapp-internal/models";
|
import { deleteModel } from "@yaakapp-internal/models";
|
||||||
|
import { HStack, Icon } from "@yaakapp-internal/ui";
|
||||||
import { useCopyHttpResponse } from "../hooks/useCopyHttpResponse";
|
import { useCopyHttpResponse } from "../hooks/useCopyHttpResponse";
|
||||||
import { useDeleteHttpResponses } from "../hooks/useDeleteHttpResponses";
|
import { useDeleteHttpResponses } from "../hooks/useDeleteHttpResponses";
|
||||||
import { useSaveResponse } from "../hooks/useSaveResponse";
|
import { useSaveResponse } from "../hooks/useSaveResponse";
|
||||||
import { pluralize } from "../lib/pluralize";
|
import { pluralize } from "../lib/pluralize";
|
||||||
import { Dropdown } from "./core/Dropdown";
|
import { Dropdown } from "./core/Dropdown";
|
||||||
import { HttpStatusTag } from "./core/HttpStatusTag";
|
import { HttpStatusTag } from "./core/HttpStatusTag";
|
||||||
import { Icon } from "./core/Icon";
|
|
||||||
import { IconButton } from "./core/IconButton";
|
import { IconButton } from "./core/IconButton";
|
||||||
import { HStack } from "./core/Stacks";
|
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
responses: HttpResponse[];
|
responses: HttpResponse[];
|
||||||
@@ -1,12 +1,11 @@
|
|||||||
import type { WebsocketConnection } from "@yaakapp-internal/models";
|
import type { WebsocketConnection } from "@yaakapp-internal/models";
|
||||||
import { deleteModel, getModel } from "@yaakapp-internal/models";
|
import { deleteModel, getModel } from "@yaakapp-internal/models";
|
||||||
|
import { HStack, Icon } from "@yaakapp-internal/ui";
|
||||||
import { formatDistanceToNowStrict } from "date-fns";
|
import { formatDistanceToNowStrict } from "date-fns";
|
||||||
import { deleteWebsocketConnections } from "../commands/deleteWebsocketConnections";
|
import { deleteWebsocketConnections } from "../commands/deleteWebsocketConnections";
|
||||||
import { pluralizeCount } from "../lib/pluralize";
|
import { pluralizeCount } from "../lib/pluralize";
|
||||||
import { Dropdown } from "./core/Dropdown";
|
import { Dropdown } from "./core/Dropdown";
|
||||||
import { Icon } from "./core/Icon";
|
|
||||||
import { IconButton } from "./core/IconButton";
|
import { IconButton } from "./core/IconButton";
|
||||||
import { HStack } from "./core/Stacks";
|
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
connections: WebsocketConnection[];
|
connections: WebsocketConnection[];
|
||||||
@@ -2,7 +2,7 @@ import type { HttpResponse } from "@yaakapp-internal/models";
|
|||||||
import { lazy, Suspense } from "react";
|
import { lazy, Suspense } from "react";
|
||||||
import { useHttpRequestBody } from "../hooks/useHttpRequestBody";
|
import { useHttpRequestBody } from "../hooks/useHttpRequestBody";
|
||||||
import { getMimeTypeFromContentType, languageFromContentType } from "../lib/contentType";
|
import { getMimeTypeFromContentType, languageFromContentType } from "../lib/contentType";
|
||||||
import { LoadingIcon } from "./core/LoadingIcon";
|
import { LoadingIcon } from "@yaakapp-internal/ui";
|
||||||
import { EmptyStateText } from "./EmptyStateText";
|
import { EmptyStateText } from "./EmptyStateText";
|
||||||
import { AudioViewer } from "./responseViewers/AudioViewer";
|
import { AudioViewer } from "./responseViewers/AudioViewer";
|
||||||
import { CsvViewer } from "./responseViewers/CsvViewer";
|
import { CsvViewer } from "./responseViewers/CsvViewer";
|
||||||
@@ -6,7 +6,7 @@ import { showPrompt } from "../lib/prompt";
|
|||||||
import { Button } from "./core/Button";
|
import { Button } from "./core/Button";
|
||||||
import type { DropdownItem } from "./core/Dropdown";
|
import type { DropdownItem } from "./core/Dropdown";
|
||||||
import { HttpMethodTag, HttpMethodTagRaw } from "./core/HttpMethodTag";
|
import { HttpMethodTag, HttpMethodTagRaw } from "./core/HttpMethodTag";
|
||||||
import { Icon } from "./core/Icon";
|
import { Icon } from "@yaakapp-internal/ui";
|
||||||
import type { RadioDropdownItem } from "./core/RadioDropdown";
|
import type { RadioDropdownItem } from "./core/RadioDropdown";
|
||||||
import { RadioDropdown } from "./core/RadioDropdown";
|
import { RadioDropdown } from "./core/RadioDropdown";
|
||||||
|
|
||||||
@@ -1,13 +1,10 @@
|
|||||||
import { Button } from "./core/Button";
|
import { Button, FormattedError, Heading, VStack } from "@yaakapp-internal/ui";
|
||||||
import { DetailsBanner } from "./core/DetailsBanner";
|
import { DetailsBanner } from "./core/DetailsBanner";
|
||||||
import { FormattedError } from "./core/FormattedError";
|
|
||||||
import { Heading } from "./core/Heading";
|
|
||||||
import { VStack } from "./core/Stacks";
|
|
||||||
|
|
||||||
export default function RouteError({ error }: { error: unknown }) {
|
export default function RouteError({ error }: { error: unknown }) {
|
||||||
console.log("Error", error);
|
console.log("Error", error);
|
||||||
const stringified = JSON.stringify(error);
|
const stringified = JSON.stringify(error);
|
||||||
// oxlint-disable-next-line no-explicit-any
|
// oxlint-disable-next-line no-explicit-any -- none
|
||||||
const message = (error as any).message ?? stringified;
|
const message = (error as any).message ?? stringified;
|
||||||
const stack =
|
const stack =
|
||||||
typeof error === "object" && error != null && "stack" in error ? String(error.stack) : null;
|
typeof error === "object" && error != null && "stack" in error ? String(error.stack) : null;
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import { getCurrentWebviewWindow } from "@tauri-apps/api/webviewWindow";
|
import { getCurrentWebviewWindow } from "@tauri-apps/api/webviewWindow";
|
||||||
import { open } from "@tauri-apps/plugin-dialog";
|
import { open } from "@tauri-apps/plugin-dialog";
|
||||||
|
import { HStack } from "@yaakapp-internal/ui";
|
||||||
import classNames from "classnames";
|
import classNames from "classnames";
|
||||||
import mime from "mime";
|
import mime from "mime";
|
||||||
import type { ReactNode } from "react";
|
import type { ReactNode } from "react";
|
||||||
@@ -9,7 +10,6 @@ import { Button } from "./core/Button";
|
|||||||
import { IconButton } from "./core/IconButton";
|
import { IconButton } from "./core/IconButton";
|
||||||
import { IconTooltip } from "./core/IconTooltip";
|
import { IconTooltip } from "./core/IconTooltip";
|
||||||
import { Label } from "./core/Label";
|
import { Label } from "./core/Label";
|
||||||
import { HStack } from "./core/Stacks";
|
|
||||||
|
|
||||||
type Props = Omit<ButtonProps, "type"> & {
|
type Props = Omit<ButtonProps, "type"> & {
|
||||||
onChange: (value: { filePath: string | null; contentType: string | null }) => void;
|
onChange: (value: { filePath: string | null; contentType: string | null }) => void;
|
||||||
@@ -3,16 +3,14 @@ import { getCurrentWebviewWindow } from "@tauri-apps/api/webviewWindow";
|
|||||||
import { type } from "@tauri-apps/plugin-os";
|
import { type } from "@tauri-apps/plugin-os";
|
||||||
import { useLicense } from "@yaakapp-internal/license";
|
import { useLicense } from "@yaakapp-internal/license";
|
||||||
import { pluginsAtom, settingsAtom } from "@yaakapp-internal/models";
|
import { pluginsAtom, settingsAtom } from "@yaakapp-internal/models";
|
||||||
|
import { HeaderSize, HStack, Icon } from "@yaakapp-internal/ui";
|
||||||
import classNames from "classnames";
|
import classNames from "classnames";
|
||||||
import { useAtomValue } from "jotai";
|
import { useAtomValue } from "jotai";
|
||||||
import { useKeyPressEvent } from "react-use";
|
import { useKeyPressEvent } from "react-use";
|
||||||
import { appInfo } from "../../lib/appInfo";
|
import { appInfo } from "../../lib/appInfo";
|
||||||
import { capitalize } from "../../lib/capitalize";
|
import { capitalize } from "../../lib/capitalize";
|
||||||
import { CountBadge } from "../core/CountBadge";
|
import { CountBadge } from "../core/CountBadge";
|
||||||
import { Icon } from "../core/Icon";
|
|
||||||
import { HStack } from "../core/Stacks";
|
|
||||||
import { TabContent, type TabItem, Tabs } from "../core/Tabs/Tabs";
|
import { TabContent, type TabItem, Tabs } from "../core/Tabs/Tabs";
|
||||||
import { HeaderSize } from "../HeaderSize";
|
|
||||||
import { SettingsCertificates } from "./SettingsCertificates";
|
import { SettingsCertificates } from "./SettingsCertificates";
|
||||||
import { SettingsGeneral } from "./SettingsGeneral";
|
import { SettingsGeneral } from "./SettingsGeneral";
|
||||||
import { SettingsHotkeys } from "./SettingsHotkeys";
|
import { SettingsHotkeys } from "./SettingsHotkeys";
|
||||||
@@ -77,6 +75,10 @@ export default function Settings({ hide }: Props) {
|
|||||||
onlyXWindowControl
|
onlyXWindowControl
|
||||||
size="md"
|
size="md"
|
||||||
className="x-theme-appHeader bg-surface text-text-subtle flex items-center justify-center border-b border-border-subtle text-sm font-semibold"
|
className="x-theme-appHeader bg-surface text-text-subtle flex items-center justify-center border-b border-border-subtle text-sm font-semibold"
|
||||||
|
osType={type()}
|
||||||
|
hideWindowControls={settings.hideWindowControls}
|
||||||
|
useNativeTitlebar={settings.useNativeTitlebar}
|
||||||
|
interfaceScale={settings.interfaceScale}
|
||||||
>
|
>
|
||||||
<HStack
|
<HStack
|
||||||
space={2}
|
space={2}
|
||||||
@@ -1,17 +1,15 @@
|
|||||||
import type { ClientCertificate } from "@yaakapp-internal/models";
|
import type { ClientCertificate } from "@yaakapp-internal/models";
|
||||||
import { patchModel, settingsAtom } from "@yaakapp-internal/models";
|
import { patchModel, settingsAtom } from "@yaakapp-internal/models";
|
||||||
|
import { Heading, HStack, InlineCode, VStack } from "@yaakapp-internal/ui";
|
||||||
import { useAtomValue } from "jotai";
|
import { useAtomValue } from "jotai";
|
||||||
import { useRef } from "react";
|
import { useRef } from "react";
|
||||||
import { showConfirmDelete } from "../../lib/confirm";
|
import { showConfirmDelete } from "../../lib/confirm";
|
||||||
import { Button } from "../core/Button";
|
import { Button } from "../core/Button";
|
||||||
import { Checkbox } from "../core/Checkbox";
|
import { Checkbox } from "../core/Checkbox";
|
||||||
import { DetailsBanner } from "../core/DetailsBanner";
|
import { DetailsBanner } from "../core/DetailsBanner";
|
||||||
import { Heading } from "../core/Heading";
|
|
||||||
import { IconButton } from "../core/IconButton";
|
import { IconButton } from "../core/IconButton";
|
||||||
import { InlineCode } from "../core/InlineCode";
|
|
||||||
import { PlainInput } from "../core/PlainInput";
|
import { PlainInput } from "../core/PlainInput";
|
||||||
import { Separator } from "../core/Separator";
|
import { Separator } from "../core/Separator";
|
||||||
import { HStack, VStack } from "../core/Stacks";
|
|
||||||
import { SelectFile } from "../SelectFile";
|
import { SelectFile } from "../SelectFile";
|
||||||
|
|
||||||
function createEmptyCertificate(): ClientCertificate {
|
function createEmptyCertificate(): ClientCertificate {
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import { revealItemInDir } from "@tauri-apps/plugin-opener";
|
import { revealItemInDir } from "@tauri-apps/plugin-opener";
|
||||||
import { patchModel, settingsAtom } from "@yaakapp-internal/models";
|
import { patchModel, settingsAtom } from "@yaakapp-internal/models";
|
||||||
|
import { Heading, VStack } from "@yaakapp-internal/ui";
|
||||||
import { useAtomValue } from "jotai";
|
import { useAtomValue } from "jotai";
|
||||||
import { activeWorkspaceAtom } from "../../hooks/useActiveWorkspace";
|
import { activeWorkspaceAtom } from "../../hooks/useActiveWorkspace";
|
||||||
import { useCheckForUpdates } from "../../hooks/useCheckForUpdates";
|
import { useCheckForUpdates } from "../../hooks/useCheckForUpdates";
|
||||||
@@ -7,13 +8,11 @@ import { appInfo } from "../../lib/appInfo";
|
|||||||
import { revealInFinderText } from "../../lib/reveal";
|
import { revealInFinderText } from "../../lib/reveal";
|
||||||
import { CargoFeature } from "../CargoFeature";
|
import { CargoFeature } from "../CargoFeature";
|
||||||
import { Checkbox } from "../core/Checkbox";
|
import { Checkbox } from "../core/Checkbox";
|
||||||
import { Heading } from "../core/Heading";
|
|
||||||
import { IconButton } from "../core/IconButton";
|
import { IconButton } from "../core/IconButton";
|
||||||
import { KeyValueRow, KeyValueRows } from "../core/KeyValueRow";
|
import { KeyValueRow, KeyValueRows } from "../core/KeyValueRow";
|
||||||
import { PlainInput } from "../core/PlainInput";
|
import { PlainInput } from "../core/PlainInput";
|
||||||
import { Select } from "../core/Select";
|
import { Select } from "../core/Select";
|
||||||
import { Separator } from "../core/Separator";
|
import { Separator } from "../core/Separator";
|
||||||
import { VStack } from "../core/Stacks";
|
|
||||||
|
|
||||||
export function SettingsGeneral() {
|
export function SettingsGeneral() {
|
||||||
const workspace = useAtomValue(activeWorkspaceAtom);
|
const workspace = useAtomValue(activeWorkspaceAtom);
|
||||||
@@ -1,4 +1,16 @@
|
|||||||
import { patchModel, settingsAtom } from "@yaakapp-internal/models";
|
import { patchModel, settingsAtom } from "@yaakapp-internal/models";
|
||||||
|
import {
|
||||||
|
Heading,
|
||||||
|
HStack,
|
||||||
|
Icon,
|
||||||
|
Table,
|
||||||
|
TableBody,
|
||||||
|
TableCell,
|
||||||
|
TableHead,
|
||||||
|
TableHeaderCell,
|
||||||
|
TableRow,
|
||||||
|
VStack,
|
||||||
|
} from "@yaakapp-internal/ui";
|
||||||
import classNames from "classnames";
|
import classNames from "classnames";
|
||||||
import { fuzzyMatch } from "fuzzbunny";
|
import { fuzzyMatch } from "fuzzbunny";
|
||||||
import { useAtomValue } from "jotai";
|
import { useAtomValue } from "jotai";
|
||||||
@@ -16,13 +28,9 @@ import { capitalize } from "../../lib/capitalize";
|
|||||||
import { showDialog } from "../../lib/dialog";
|
import { showDialog } from "../../lib/dialog";
|
||||||
import { Button } from "../core/Button";
|
import { Button } from "../core/Button";
|
||||||
import { Dropdown, type DropdownItem } from "../core/Dropdown";
|
import { Dropdown, type DropdownItem } from "../core/Dropdown";
|
||||||
import { Heading } from "../core/Heading";
|
|
||||||
import { HotkeyRaw } from "../core/Hotkey";
|
import { HotkeyRaw } from "../core/Hotkey";
|
||||||
import { Icon } from "../core/Icon";
|
|
||||||
import { IconButton } from "../core/IconButton";
|
import { IconButton } from "../core/IconButton";
|
||||||
import { PlainInput } from "../core/PlainInput";
|
import { PlainInput } from "../core/PlainInput";
|
||||||
import { HStack, VStack } from "../core/Stacks";
|
|
||||||
import { Table, TableBody, TableCell, TableHead, TableHeaderCell, TableRow } from "../core/Table";
|
|
||||||
|
|
||||||
const HOLD_KEYS = ["Shift", "Control", "Alt", "Meta"];
|
const HOLD_KEYS = ["Shift", "Control", "Alt", "Meta"];
|
||||||
const LAYOUT_INSENSITIVE_KEYS = [
|
const LAYOUT_INSENSITIVE_KEYS = [
|
||||||
@@ -3,21 +3,17 @@ import { useFonts } from "@yaakapp-internal/fonts";
|
|||||||
import { useLicense } from "@yaakapp-internal/license";
|
import { useLicense } from "@yaakapp-internal/license";
|
||||||
import type { EditorKeymap, Settings } from "@yaakapp-internal/models";
|
import type { EditorKeymap, Settings } from "@yaakapp-internal/models";
|
||||||
import { patchModel, settingsAtom } from "@yaakapp-internal/models";
|
import { patchModel, settingsAtom } from "@yaakapp-internal/models";
|
||||||
|
import { clamp, Heading, HStack, Icon, VStack } from "@yaakapp-internal/ui";
|
||||||
import { useAtomValue } from "jotai";
|
import { useAtomValue } from "jotai";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
|
|
||||||
import { activeWorkspaceAtom } from "../../hooks/useActiveWorkspace";
|
import { activeWorkspaceAtom } from "../../hooks/useActiveWorkspace";
|
||||||
import { clamp } from "../../lib/clamp";
|
|
||||||
import { showConfirm } from "../../lib/confirm";
|
import { showConfirm } from "../../lib/confirm";
|
||||||
import { invokeCmd } from "../../lib/tauri";
|
import { invokeCmd } from "../../lib/tauri";
|
||||||
import { CargoFeature } from "../CargoFeature";
|
import { CargoFeature } from "../CargoFeature";
|
||||||
import { Button } from "../core/Button";
|
import { Button } from "../core/Button";
|
||||||
import { Checkbox } from "../core/Checkbox";
|
import { Checkbox } from "../core/Checkbox";
|
||||||
import { Heading } from "../core/Heading";
|
|
||||||
import { Icon } from "../core/Icon";
|
|
||||||
import { Link } from "../core/Link";
|
import { Link } from "../core/Link";
|
||||||
import { Select } from "../core/Select";
|
import { Select } from "../core/Select";
|
||||||
import { HStack, VStack } from "../core/Stacks";
|
|
||||||
|
|
||||||
const NULL_FONT_VALUE = "__NULL_FONT__";
|
const NULL_FONT_VALUE = "__NULL_FONT__";
|
||||||
|
|
||||||
@@ -1,18 +1,16 @@
|
|||||||
import { openUrl } from "@tauri-apps/plugin-opener";
|
import { openUrl } from "@tauri-apps/plugin-opener";
|
||||||
import { useLicense } from "@yaakapp-internal/license";
|
import { useLicense } from "@yaakapp-internal/license";
|
||||||
|
import { Banner, HStack, Icon, VStack } from "@yaakapp-internal/ui";
|
||||||
import { differenceInDays } from "date-fns";
|
import { differenceInDays } from "date-fns";
|
||||||
import { formatDate } from "date-fns/format";
|
import { formatDate } from "date-fns/format";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { useToggle } from "../../hooks/useToggle";
|
import { useToggle } from "../../hooks/useToggle";
|
||||||
import { pluralizeCount } from "../../lib/pluralize";
|
import { pluralizeCount } from "../../lib/pluralize";
|
||||||
import { CargoFeature } from "../CargoFeature";
|
import { CargoFeature } from "../CargoFeature";
|
||||||
import { Banner } from "../core/Banner";
|
|
||||||
import { Button } from "../core/Button";
|
import { Button } from "../core/Button";
|
||||||
import { Icon } from "../core/Icon";
|
|
||||||
import { Link } from "../core/Link";
|
import { Link } from "../core/Link";
|
||||||
import { PlainInput } from "../core/PlainInput";
|
import { PlainInput } from "../core/PlainInput";
|
||||||
import { Separator } from "../core/Separator";
|
import { Separator } from "../core/Separator";
|
||||||
import { HStack, VStack } from "../core/Stacks";
|
|
||||||
|
|
||||||
export function SettingsLicense() {
|
export function SettingsLicense() {
|
||||||
return (
|
return (
|
||||||
@@ -9,10 +9,22 @@ import {
|
|||||||
searchPlugins,
|
searchPlugins,
|
||||||
uninstallPlugin,
|
uninstallPlugin,
|
||||||
} from "@yaakapp-internal/plugins";
|
} from "@yaakapp-internal/plugins";
|
||||||
|
import {
|
||||||
|
HStack,
|
||||||
|
Icon,
|
||||||
|
InlineCode,
|
||||||
|
LoadingIcon,
|
||||||
|
Table,
|
||||||
|
TableBody,
|
||||||
|
TableCell,
|
||||||
|
TableHead,
|
||||||
|
TableHeaderCell,
|
||||||
|
TableRow,
|
||||||
|
useDebouncedValue,
|
||||||
|
} from "@yaakapp-internal/ui";
|
||||||
import classNames from "classnames";
|
import classNames from "classnames";
|
||||||
import { useAtomValue } from "jotai";
|
import { useAtomValue } from "jotai";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { useDebouncedValue } from "../../hooks/useDebouncedValue";
|
|
||||||
import { useInstallPlugin } from "../../hooks/useInstallPlugin";
|
import { useInstallPlugin } from "../../hooks/useInstallPlugin";
|
||||||
import { usePluginInfo } from "../../hooks/usePluginInfo";
|
import { usePluginInfo } from "../../hooks/usePluginInfo";
|
||||||
import { usePluginsKey, useRefreshPlugins } from "../../hooks/usePlugins";
|
import { usePluginsKey, useRefreshPlugins } from "../../hooks/usePlugins";
|
||||||
@@ -21,14 +33,9 @@ import { minPromiseMillis } from "../../lib/minPromiseMillis";
|
|||||||
import { Button } from "../core/Button";
|
import { Button } from "../core/Button";
|
||||||
import { Checkbox } from "../core/Checkbox";
|
import { Checkbox } from "../core/Checkbox";
|
||||||
import { CountBadge } from "../core/CountBadge";
|
import { CountBadge } from "../core/CountBadge";
|
||||||
import { Icon } from "../core/Icon";
|
|
||||||
import { IconButton } from "../core/IconButton";
|
import { IconButton } from "../core/IconButton";
|
||||||
import { InlineCode } from "../core/InlineCode";
|
|
||||||
import { Link } from "../core/Link";
|
import { Link } from "../core/Link";
|
||||||
import { LoadingIcon } from "../core/LoadingIcon";
|
|
||||||
import { PlainInput } from "../core/PlainInput";
|
import { PlainInput } from "../core/PlainInput";
|
||||||
import { HStack } from "../core/Stacks";
|
|
||||||
import { Table, TableBody, TableCell, TableHead, TableHeaderCell, TableRow } from "../core/Table";
|
|
||||||
import { TabContent, Tabs } from "../core/Tabs/Tabs";
|
import { TabContent, Tabs } from "../core/Tabs/Tabs";
|
||||||
import { EmptyStateText } from "../EmptyStateText";
|
import { EmptyStateText } from "../EmptyStateText";
|
||||||
import { SelectFile } from "../SelectFile";
|
import { SelectFile } from "../SelectFile";
|
||||||
@@ -1,13 +1,10 @@
|
|||||||
import { patchModel, settingsAtom } from "@yaakapp-internal/models";
|
import { patchModel, settingsAtom } from "@yaakapp-internal/models";
|
||||||
|
import { Heading, HStack, InlineCode, VStack } from "@yaakapp-internal/ui";
|
||||||
import { useAtomValue } from "jotai";
|
import { useAtomValue } from "jotai";
|
||||||
|
|
||||||
import { Checkbox } from "../core/Checkbox";
|
import { Checkbox } from "../core/Checkbox";
|
||||||
import { Heading } from "../core/Heading";
|
|
||||||
import { InlineCode } from "../core/InlineCode";
|
|
||||||
import { PlainInput } from "../core/PlainInput";
|
import { PlainInput } from "../core/PlainInput";
|
||||||
import { Select } from "../core/Select";
|
import { Select } from "../core/Select";
|
||||||
import { Separator } from "../core/Separator";
|
import { Separator } from "../core/Separator";
|
||||||
import { HStack, VStack } from "../core/Stacks";
|
|
||||||
|
|
||||||
export function SettingsProxy() {
|
export function SettingsProxy() {
|
||||||
const settings = useAtomValue(settingsAtom);
|
const settings = useAtomValue(settingsAtom);
|
||||||
@@ -1,18 +1,15 @@
|
|||||||
import { patchModel, settingsAtom } from "@yaakapp-internal/models";
|
import { patchModel, settingsAtom } from "@yaakapp-internal/models";
|
||||||
|
import { Heading, HStack, Icon, type IconProps, VStack } from "@yaakapp-internal/ui";
|
||||||
import { useAtomValue } from "jotai";
|
import { useAtomValue } from "jotai";
|
||||||
import { lazy, Suspense } from "react";
|
import { lazy, Suspense } from "react";
|
||||||
import { activeWorkspaceAtom } from "../../hooks/useActiveWorkspace";
|
import { activeWorkspaceAtom } from "../../hooks/useActiveWorkspace";
|
||||||
import { useResolvedAppearance } from "../../hooks/useResolvedAppearance";
|
import { useResolvedAppearance } from "../../hooks/useResolvedAppearance";
|
||||||
import { useResolvedTheme } from "../../hooks/useResolvedTheme";
|
import { useResolvedTheme } from "../../hooks/useResolvedTheme";
|
||||||
import type { ButtonProps } from "../core/Button";
|
import type { ButtonProps } from "../core/Button";
|
||||||
import { Heading } from "../core/Heading";
|
|
||||||
import type { IconProps } from "../core/Icon";
|
|
||||||
import { Icon } from "../core/Icon";
|
|
||||||
import { IconButton } from "../core/IconButton";
|
import { IconButton } from "../core/IconButton";
|
||||||
import { Link } from "../core/Link";
|
import { Link } from "../core/Link";
|
||||||
import type { SelectProps } from "../core/Select";
|
import type { SelectProps } from "../core/Select";
|
||||||
import { Select } from "../core/Select";
|
import { Select } from "../core/Select";
|
||||||
import { HStack, VStack } from "../core/Stacks";
|
|
||||||
|
|
||||||
const Editor = lazy(() => import("../core/Editor/Editor").then((m) => ({ default: m.Editor })));
|
const Editor = lazy(() => import("../core/Editor/Editor").then((m) => ({ default: m.Editor })));
|
||||||
|
|
||||||
@@ -9,7 +9,7 @@ import { showDialog } from "../lib/dialog";
|
|||||||
import { importData } from "../lib/importData";
|
import { importData } from "../lib/importData";
|
||||||
import type { DropdownRef } from "./core/Dropdown";
|
import type { DropdownRef } from "./core/Dropdown";
|
||||||
import { Dropdown } from "./core/Dropdown";
|
import { Dropdown } from "./core/Dropdown";
|
||||||
import { Icon } from "./core/Icon";
|
import { Icon } from "@yaakapp-internal/ui";
|
||||||
import { IconButton } from "./core/IconButton";
|
import { IconButton } from "./core/IconButton";
|
||||||
import { KeyboardShortcutsDialog } from "./KeyboardShortcutsDialog";
|
import { KeyboardShortcutsDialog } from "./KeyboardShortcutsDialog";
|
||||||
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user