diff --git a/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/build.rs b/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/build.rs
index c61a92e9..ece34b20 100644
--- a/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/build.rs
+++ b/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/build.rs
@@ -21,6 +21,7 @@ const COMMANDS: &[&str] = &[
"get_external_sdcard_path",
"open_external_url",
"select_directory",
+ "get_storefront_region_code",
"register_listener",
"remove_listener",
"request_manage_storage_permission",
diff --git a/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/ios/Sources/NativeBridgePlugin.swift b/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/ios/Sources/NativeBridgePlugin.swift
index f573b4b5..9537a8ca 100644
--- a/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/ios/Sources/NativeBridgePlugin.swift
+++ b/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/ios/Sources/NativeBridgePlugin.swift
@@ -879,6 +879,16 @@ class NativeBridgePlugin: Plugin {
invoke.reject("Failed to copy file: \(error.localizedDescription)")
}
}
+
+ @objc public func get_storefront_region_code(_ invoke: Invoke) {
+ Task {
+ if let storefront = await Storefront.current {
+ invoke.resolve(["regionCode": storefront.countryCode])
+ } else {
+ invoke.reject("Failed to get region code")
+ }
+ }
+ }
}
@_cdecl("init_plugin_native_bridge")
diff --git a/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/permissions/autogenerated/commands/get_storefront_region_code.toml b/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/permissions/autogenerated/commands/get_storefront_region_code.toml
new file mode 100644
index 00000000..5f0c6fda
--- /dev/null
+++ b/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/permissions/autogenerated/commands/get_storefront_region_code.toml
@@ -0,0 +1,13 @@
+# Automatically generated - DO NOT EDIT!
+
+"$schema" = "../../schemas/schema.json"
+
+[[permission]]
+identifier = "allow-get-storefront-region-code"
+description = "Enables the get_storefront_region_code command without any pre-configured scope."
+commands.allow = ["get_storefront_region_code"]
+
+[[permission]]
+identifier = "deny-get-storefront-region-code"
+description = "Denies the get_storefront_region_code command without any pre-configured scope."
+commands.deny = ["get_storefront_region_code"]
diff --git a/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/permissions/autogenerated/reference.md b/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/permissions/autogenerated/reference.md
index 2a1b59e4..0b67e542 100644
--- a/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/permissions/autogenerated/reference.md
+++ b/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/permissions/autogenerated/reference.md
@@ -26,6 +26,7 @@ Default permissions for the plugin
- `allow-get-external-sdcard-path`
- `allow-open-external-url`
- `allow-select-directory`
+- `allow-get-storefront-region-code`
- `allow-request-manage-storage-permission`
- `allow-register-listener`
- `allow-remove-listener`
@@ -306,6 +307,32 @@ Denies the get_status_bar_height command without any pre-configured scope.
|
+`native-bridge:allow-get-storefront-region-code`
+
+ |
+
+
+Enables the get_storefront_region_code command without any pre-configured scope.
+
+ |
+
+
+
+|
+
+`native-bridge:deny-get-storefront-region-code`
+
+ |
+
+
+Denies the get_storefront_region_code command without any pre-configured scope.
+
+ |
+
+
+
+|
+
`native-bridge:allow-get-sys-fonts-list`
|
diff --git a/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/permissions/default.toml b/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/permissions/default.toml
index 83b54f92..e9fc5e8a 100644
--- a/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/permissions/default.toml
+++ b/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/permissions/default.toml
@@ -23,6 +23,7 @@ permissions = [
"allow-get-external-sdcard-path",
"allow-open-external-url",
"allow-select-directory",
+ "allow-get-storefront-region-code",
"allow-request-manage-storage-permission",
"allow-register-listener",
"allow-remove-listener",
diff --git a/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/permissions/schemas/schema.json b/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/permissions/schemas/schema.json
index a3684de1..cb0cc2e3 100644
--- a/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/permissions/schemas/schema.json
+++ b/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/permissions/schemas/schema.json
@@ -414,6 +414,18 @@
"const": "deny-get-status-bar-height",
"markdownDescription": "Denies the get_status_bar_height command without any pre-configured scope."
},
+ {
+ "description": "Enables the get_storefront_region_code command without any pre-configured scope.",
+ "type": "string",
+ "const": "allow-get-storefront-region-code",
+ "markdownDescription": "Enables the get_storefront_region_code command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the get_storefront_region_code command without any pre-configured scope.",
+ "type": "string",
+ "const": "deny-get-storefront-region-code",
+ "markdownDescription": "Denies the get_storefront_region_code command without any pre-configured scope."
+ },
{
"description": "Enables the get_sys_fonts_list command without any pre-configured scope.",
"type": "string",
@@ -667,10 +679,10 @@
"markdownDescription": "Denies the use_background_audio command without any pre-configured scope."
},
{
- "description": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-auth-with-safari`\n- `allow-auth-with-custom-tab`\n- `allow-copy-uri-to-path`\n- `allow-use-background-audio`\n- `allow-install-package`\n- `allow-set-system-ui-visibility`\n- `allow-get-status-bar-height`\n- `allow-get-sys-fonts-list`\n- `allow-intercept-keys`\n- `allow-lock-screen-orientation`\n- `allow-iap-is-available`\n- `allow-iap-initialize`\n- `allow-iap-fetch-products`\n- `allow-iap-purchase-product`\n- `allow-iap-restore-purchases`\n- `allow-get-system-color-scheme`\n- `allow-get-safe-area-insets`\n- `allow-get-screen-brightness`\n- `allow-set-screen-brightness`\n- `allow-get-external-sdcard-path`\n- `allow-open-external-url`\n- `allow-select-directory`\n- `allow-request-manage-storage-permission`\n- `allow-register-listener`\n- `allow-remove-listener`\n- `allow-check-permissions`\n- `allow-request-permissions`\n- `allow-checkPermissions`\n- `allow-requestPermissions`",
+ "description": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-auth-with-safari`\n- `allow-auth-with-custom-tab`\n- `allow-copy-uri-to-path`\n- `allow-use-background-audio`\n- `allow-install-package`\n- `allow-set-system-ui-visibility`\n- `allow-get-status-bar-height`\n- `allow-get-sys-fonts-list`\n- `allow-intercept-keys`\n- `allow-lock-screen-orientation`\n- `allow-iap-is-available`\n- `allow-iap-initialize`\n- `allow-iap-fetch-products`\n- `allow-iap-purchase-product`\n- `allow-iap-restore-purchases`\n- `allow-get-system-color-scheme`\n- `allow-get-safe-area-insets`\n- `allow-get-screen-brightness`\n- `allow-set-screen-brightness`\n- `allow-get-external-sdcard-path`\n- `allow-open-external-url`\n- `allow-select-directory`\n- `allow-get-storefront-region-code`\n- `allow-request-manage-storage-permission`\n- `allow-register-listener`\n- `allow-remove-listener`\n- `allow-check-permissions`\n- `allow-request-permissions`\n- `allow-checkPermissions`\n- `allow-requestPermissions`",
"type": "string",
"const": "default",
- "markdownDescription": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-auth-with-safari`\n- `allow-auth-with-custom-tab`\n- `allow-copy-uri-to-path`\n- `allow-use-background-audio`\n- `allow-install-package`\n- `allow-set-system-ui-visibility`\n- `allow-get-status-bar-height`\n- `allow-get-sys-fonts-list`\n- `allow-intercept-keys`\n- `allow-lock-screen-orientation`\n- `allow-iap-is-available`\n- `allow-iap-initialize`\n- `allow-iap-fetch-products`\n- `allow-iap-purchase-product`\n- `allow-iap-restore-purchases`\n- `allow-get-system-color-scheme`\n- `allow-get-safe-area-insets`\n- `allow-get-screen-brightness`\n- `allow-set-screen-brightness`\n- `allow-get-external-sdcard-path`\n- `allow-open-external-url`\n- `allow-select-directory`\n- `allow-request-manage-storage-permission`\n- `allow-register-listener`\n- `allow-remove-listener`\n- `allow-check-permissions`\n- `allow-request-permissions`\n- `allow-checkPermissions`\n- `allow-requestPermissions`"
+ "markdownDescription": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-auth-with-safari`\n- `allow-auth-with-custom-tab`\n- `allow-copy-uri-to-path`\n- `allow-use-background-audio`\n- `allow-install-package`\n- `allow-set-system-ui-visibility`\n- `allow-get-status-bar-height`\n- `allow-get-sys-fonts-list`\n- `allow-intercept-keys`\n- `allow-lock-screen-orientation`\n- `allow-iap-is-available`\n- `allow-iap-initialize`\n- `allow-iap-fetch-products`\n- `allow-iap-purchase-product`\n- `allow-iap-restore-purchases`\n- `allow-get-system-color-scheme`\n- `allow-get-safe-area-insets`\n- `allow-get-screen-brightness`\n- `allow-set-screen-brightness`\n- `allow-get-external-sdcard-path`\n- `allow-open-external-url`\n- `allow-select-directory`\n- `allow-get-storefront-region-code`\n- `allow-request-manage-storage-permission`\n- `allow-register-listener`\n- `allow-remove-listener`\n- `allow-check-permissions`\n- `allow-request-permissions`\n- `allow-checkPermissions`\n- `allow-requestPermissions`"
}
]
}
diff --git a/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/src/commands.rs b/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/src/commands.rs
index 7cc77679..a8b9c040 100644
--- a/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/src/commands.rs
+++ b/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/src/commands.rs
@@ -186,6 +186,13 @@ pub(crate) async fn select_directory(
Ok(result)
}
+#[command]
+pub(crate) async fn get_storefront_region_code(
+ app: AppHandle,
+) -> Result {
+ app.native_bridge().get_storefront_region_code()
+}
+
#[command]
pub(crate) async fn request_manage_storage_permission(
app: AppHandle,
diff --git a/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/src/desktop.rs b/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/src/desktop.rs
index 2550e2e1..a312dd42 100644
--- a/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/src/desktop.rs
+++ b/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/src/desktop.rs
@@ -137,6 +137,10 @@ impl NativeBridge {
Err(crate::Error::UnsupportedPlatformError)
}
+ pub fn get_storefront_region_code(&self) -> crate::Result {
+ Err(crate::Error::UnsupportedPlatformError)
+ }
+
pub fn request_manage_storage_permission(
&self,
) -> crate::Result {
diff --git a/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/src/lib.rs b/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/src/lib.rs
index 91701051..c4d74818 100644
--- a/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/src/lib.rs
+++ b/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/src/lib.rs
@@ -77,6 +77,7 @@ pub fn init() -> TauriPlugin {
commands::get_external_sdcard_path,
commands::open_external_url,
commands::select_directory,
+ commands::get_storefront_region_code,
commands::request_manage_storage_permission,
])
.setup(|app, api| {
diff --git a/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/src/mobile.rs b/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/src/mobile.rs
index 6f3e7b45..515e7885 100644
--- a/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/src/mobile.rs
+++ b/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/src/mobile.rs
@@ -224,6 +224,14 @@ impl NativeBridge {
}
}
+impl NativeBridge {
+ pub fn get_storefront_region_code(&self) -> crate::Result {
+ self.0
+ .run_mobile_plugin("get_storefront_region_code", ())
+ .map_err(Into::into)
+ }
+}
+
impl NativeBridge {
pub fn request_manage_storage_permission(
&self,
diff --git a/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/src/models.rs b/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/src/models.rs
index c19ba668..3736a199 100644
--- a/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/src/models.rs
+++ b/apps/readest-app/src-tauri/plugins/tauri-plugin-native-bridge/src/models.rs
@@ -230,3 +230,10 @@ pub struct SelectDirectoryResponse {
pub path: Option,
pub error: Option,
}
+
+#[derive(Debug, Deserialize, Serialize)]
+#[serde(rename_all = "camelCase")]
+pub struct GetStorefrontRegionCodeResponse {
+ pub region_code: Option,
+ pub error: Option,
+}
diff --git a/apps/readest-app/src/app/library/components/ImportMenu.tsx b/apps/readest-app/src/app/library/components/ImportMenu.tsx
index e4816fc1..a7dc7c01 100644
--- a/apps/readest-app/src/app/library/components/ImportMenu.tsx
+++ b/apps/readest-app/src/app/library/components/ImportMenu.tsx
@@ -1,8 +1,8 @@
import clsx from 'clsx';
-import { useTranslation } from '@/hooks/useTranslation';
-import { IoFileTray } from 'react-icons/io5';
import { MdRssFeed } from 'react-icons/md';
-
+import { IoFileTray } from 'react-icons/io5';
+import { useEnv } from '@/context/EnvContext';
+import { useTranslation } from '@/hooks/useTranslation';
import MenuItem from '@/components/MenuItem';
import Menu from '@/components/Menu';
@@ -20,6 +20,7 @@ const ImportMenu: React.FC = ({
onOpenCatalogManager,
}) => {
const _ = useTranslation();
+ const { appService } = useEnv();
const handleImportFromFiles = () => {
onImportBooksFromFiles();
@@ -54,7 +55,7 @@ const ImportMenu: React.FC = ({
/>
)}
}
onClick={handleOpenCatalogManager}
/>
diff --git a/apps/readest-app/src/app/library/components/OPDSDialog.tsx b/apps/readest-app/src/app/library/components/OPDSDialog.tsx
index 4e92a870..3cdb72cc 100644
--- a/apps/readest-app/src/app/library/components/OPDSDialog.tsx
+++ b/apps/readest-app/src/app/library/components/OPDSDialog.tsx
@@ -1,4 +1,5 @@
import { clsx } from 'clsx';
+import { useEnv } from '@/context/EnvContext';
import { CatalogManager } from '@/app/opds/components/CatelogManager';
import { useTranslation } from '@/hooks/useTranslation';
import Dialog from '@/components/Dialog';
@@ -9,10 +10,11 @@ interface CatalogDialogProps {
export function CatalogDialog({ onClose }: CatalogDialogProps) {
const _ = useTranslation();
+ const { appService } = useEnv();
return (