رفع باگ: تصحیح مسیردهی ارتباط کلاینت با سرویس و حل خطای دسترسی شبکه به همراه افزودن آیکون سامانه
This commit is contained in:
@@ -29,6 +29,7 @@ venv/
|
|||||||
# env & secrets
|
# env & secrets
|
||||||
.env
|
.env
|
||||||
.env.local
|
.env.local
|
||||||
|
.env.production
|
||||||
.env.*.local
|
.env.*.local
|
||||||
!.env.example
|
!.env.example
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,15 @@ const nextConfig = {
|
|||||||
// Workspace packages ship TypeScript source, so Next must transpile them.
|
// Workspace packages ship TypeScript source, so Next must transpile them.
|
||||||
transpilePackages: ["@agy/ui", "@agy/contracts"],
|
transpilePackages: ["@agy/ui", "@agy/contracts"],
|
||||||
env: {
|
env: {
|
||||||
NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL ?? "http://localhost:8000",
|
NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL ?? "",
|
||||||
|
},
|
||||||
|
async rewrites() {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
source: "/api/:path*",
|
||||||
|
destination: "http://127.0.0.1:8000/api/:path*",
|
||||||
|
},
|
||||||
|
];
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@agy/web",
|
"name": "@agy/web",
|
||||||
"version": "0.1.1",
|
"version": "0.1.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Smart Organization frontend — Next.js App Router, RTL, dark-first.",
|
"description": "Smart Organization frontend — Next.js App Router, RTL, dark-first.",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
@@ -0,0 +1,16 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" fill="none">
|
||||||
|
<rect width="32" height="32" rx="8" fill="#0b0d12"/>
|
||||||
|
<rect x="0.5" y="0.5" width="31" height="31" rx="7.5" stroke="#1e293b" stroke-width="1"/>
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="brandGrad" x1="6" y1="6" x2="26" y2="26" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0%" stop-color="#38bdf8"/>
|
||||||
|
<stop offset="50%" stop-color="#6366f1"/>
|
||||||
|
<stop offset="100%" stop-color="#a855f7"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<circle cx="16" cy="10" r="2.5" fill="url(#brandGrad)"/>
|
||||||
|
<circle cx="9" cy="22" r="2.5" fill="url(#brandGrad)"/>
|
||||||
|
<circle cx="23" cy="22" r="2.5" fill="url(#brandGrad)"/>
|
||||||
|
<path d="M16 10L9 22M16 10L23 22M9 22H23" stroke="url(#brandGrad)" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<circle cx="16" cy="18" r="1.5" fill="#38bdf8"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 896 B |
+26
-3
@@ -8,8 +8,30 @@
|
|||||||
|
|
||||||
import type { ApiErrorBody } from "@agy/contracts";
|
import type { ApiErrorBody } from "@agy/contracts";
|
||||||
|
|
||||||
export const API_BASE_URL =
|
/**
|
||||||
process.env.NEXT_PUBLIC_API_URL ?? "http://localhost:8000";
|
* Resolves the API base URL.
|
||||||
|
* In a browser:
|
||||||
|
* - If NEXT_PUBLIC_API_URL is configured and not pointing to localhost on a remote host, use it.
|
||||||
|
* - Otherwise default to relative path "" so requests go directly to the current origin (e.g. /api/*)
|
||||||
|
* behind reverse proxies (Caddy), preventing ERR_CONNECTION_REFUSED on clients.
|
||||||
|
* In SSR / Node / tests:
|
||||||
|
* - Fall back to NEXT_PUBLIC_API_URL or "http://localhost:8000".
|
||||||
|
*/
|
||||||
|
export function getApiBaseUrl(): string {
|
||||||
|
const configured = process.env.NEXT_PUBLIC_API_URL?.trim();
|
||||||
|
if (typeof window !== "undefined") {
|
||||||
|
const isLocalhost =
|
||||||
|
window.location.hostname === "localhost" ||
|
||||||
|
window.location.hostname === "127.0.0.1";
|
||||||
|
if (!configured || (!isLocalhost && configured.includes("localhost"))) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return configured;
|
||||||
|
}
|
||||||
|
return configured || "http://localhost:8000";
|
||||||
|
}
|
||||||
|
|
||||||
|
export const API_BASE_URL = getApiBaseUrl();
|
||||||
|
|
||||||
export class ApiError extends Error {
|
export class ApiError extends Error {
|
||||||
readonly status: number;
|
readonly status: number;
|
||||||
@@ -73,9 +95,10 @@ export async function apiRequest<T>(path: string, options: RequestOptions = {}):
|
|||||||
const authToken = token ?? getStoredToken();
|
const authToken = token ?? getStoredToken();
|
||||||
if (authToken) headers.Authorization = `Bearer ${authToken}`;
|
if (authToken) headers.Authorization = `Bearer ${authToken}`;
|
||||||
|
|
||||||
|
const baseUrl = getApiBaseUrl();
|
||||||
let response: Response;
|
let response: Response;
|
||||||
try {
|
try {
|
||||||
response = await fetch(`${API_BASE_URL}${path}`, {
|
response = await fetch(`${baseUrl}${path}`, {
|
||||||
method,
|
method,
|
||||||
headers,
|
headers,
|
||||||
body: body === undefined ? undefined : JSON.stringify(body),
|
body: body === undefined ? undefined : JSON.stringify(body),
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
* "the app is on the wrong version" bug into a failing test, which is the
|
* "the app is on the wrong version" bug into a failing test, which is the
|
||||||
* whole point of keeping them separate.
|
* whole point of keeping them separate.
|
||||||
*/
|
*/
|
||||||
export const APP_VERSION = "0.1.1";
|
export const APP_VERSION = "0.1.2";
|
||||||
|
|
||||||
/** What the footer pill renders — ``v`` prefix keeps it unambiguous in the UI. */
|
/** What the footer pill renders — ``v`` prefix keeps it unambiguous in the UI. */
|
||||||
export const APP_VERSION_LABEL = `v${APP_VERSION}`;
|
export const APP_VERSION_LABEL = `v${APP_VERSION}`;
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "smart-org",
|
"name": "smart-org",
|
||||||
"version": "0.1.1",
|
"version": "0.1.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Smart Organization — AI Workforce Platform. Standalone multi-tenant SaaS, independent of the Telegram bot runtime.",
|
"description": "Smart Organization — AI Workforce Platform. Standalone multi-tenant SaaS, independent of the Telegram bot runtime.",
|
||||||
"packageManager": "pnpm@9.12.0",
|
"packageManager": "pnpm@9.12.0",
|
||||||
|
|||||||
Reference in New Issue
Block a user