@howone/sdk 0.1.19 → 0.1.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +34 -4
- package/dist/index.d.ts +34 -4
- package/dist/index.js +124 -92
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +120 -89
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -423,19 +423,48 @@ interface LoginFormProps {
|
|
|
423
423
|
}
|
|
424
424
|
declare const LoginForm: React$1.FC<LoginFormProps>;
|
|
425
425
|
|
|
426
|
+
type Theme$1 = "dark" | "light" | "system";
|
|
426
427
|
type AuthContextValue = {
|
|
427
428
|
user: ReturnType<typeof parseUserFromToken> | null;
|
|
428
429
|
token: string | null;
|
|
429
430
|
isAuthenticated: boolean;
|
|
430
431
|
logout: () => void;
|
|
431
432
|
};
|
|
432
|
-
|
|
433
|
+
interface HowoneProviderProps {
|
|
433
434
|
children: React$1.ReactNode;
|
|
434
435
|
autoRedirect?: boolean;
|
|
435
436
|
showFloatingButton?: boolean;
|
|
436
437
|
projectId?: string;
|
|
437
|
-
|
|
438
|
+
/** 主题相关配置 */
|
|
439
|
+
defaultTheme?: Theme$1;
|
|
440
|
+
themeStorageKey?: string;
|
|
441
|
+
/** 如果为 true,将忽略 localStorage 中的值,始终使用 defaultTheme */
|
|
442
|
+
forceDefaultTheme?: boolean;
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* HowoneProvider - All-in-one application provider
|
|
446
|
+
*
|
|
447
|
+
* Includes:
|
|
448
|
+
* - Authentication management
|
|
449
|
+
* - Theme management (dark/light/system)
|
|
450
|
+
* - Toast notifications
|
|
451
|
+
* - Floating button
|
|
452
|
+
*
|
|
453
|
+
* @example
|
|
454
|
+
* ```tsx
|
|
455
|
+
* <HowoneProvider
|
|
456
|
+
* defaultTheme="dark"
|
|
457
|
+
* themeStorageKey="my-app-theme"
|
|
458
|
+
* showFloatingButton={true}
|
|
459
|
+
* >
|
|
460
|
+
* <App />
|
|
461
|
+
* </HowoneProvider>
|
|
462
|
+
* ```
|
|
463
|
+
*/
|
|
464
|
+
declare const HowoneProvider: React$1.FC<HowoneProviderProps>;
|
|
438
465
|
declare function useAuthContext(): AuthContextValue;
|
|
466
|
+
declare const AuthProvider: React$1.FC<HowoneProviderProps>;
|
|
467
|
+
type AuthProviderProps = HowoneProviderProps;
|
|
439
468
|
|
|
440
469
|
type AuthState = {
|
|
441
470
|
user: Record<string, unknown> | null;
|
|
@@ -504,12 +533,13 @@ type ThemeProviderProps = {
|
|
|
504
533
|
children: React.ReactNode;
|
|
505
534
|
defaultTheme?: Theme;
|
|
506
535
|
storageKey?: string;
|
|
536
|
+
forceDefault?: boolean;
|
|
507
537
|
};
|
|
508
538
|
type ThemeProviderState = {
|
|
509
539
|
theme: Theme;
|
|
510
540
|
setTheme: (theme: Theme) => void;
|
|
511
541
|
};
|
|
512
|
-
declare function ThemeProvider({ children, defaultTheme, storageKey, ...props }: ThemeProviderProps): react_jsx_runtime.JSX.Element;
|
|
542
|
+
declare function ThemeProvider({ children, defaultTheme, storageKey, forceDefault, ...props }: ThemeProviderProps): react_jsx_runtime.JSX.Element;
|
|
513
543
|
declare const useTheme: () => ThemeProviderState;
|
|
514
544
|
|
|
515
545
|
interface ThemeToggleProps {
|
|
@@ -543,4 +573,4 @@ declare function useDebounce<T>(value: T, delay: number): T;
|
|
|
543
573
|
*/
|
|
544
574
|
declare function injectEarlyErrorHandler(): void;
|
|
545
575
|
|
|
546
|
-
export { type AIWorkflowClientOptions, type AIWorkflowResponse, AUTH_ROOT, AUTH_TOKEN_KEY, type AccessContext, type Artifact, type ArtifactCreateInput, type ArtifactListQuery, AuthProvider, type AxiosAIWorkflowOptions, ClayxToast, DefaultErrorFallback, type EmailLoginRequest, type EmailLoginResponse, ErrorBoundary, FloatingButton, GlobalToastContainer, Loading, LoadingSpinner, LoginForm, type SendCodeRequest, type SendCodeResponse, ThemeProvider, ThemeToggle, type Visibility, aiRequest, aiWorkflow, canAccessArtifact, createAIWorkflowClient, createAIWorkflowClientAxios, createArtifactsClient, createClient, getAuthRoot, getCodeStatus, getDefaultProjectId, getToken, howone, injectEarlyErrorHandler, isTokenValid, loginWithEmailCode, onAuthStateChanged, parseUserFromToken, request, sendEmailVerificationCode, setAuthRoot, setDefaultProjectId, setToken, unifiedAuth, unifiedOAuth, useAuth, useAuthContext, useDebounce, useIsMobile, useTheme, workflowRequest };
|
|
576
|
+
export { type AIWorkflowClientOptions, type AIWorkflowResponse, AUTH_ROOT, AUTH_TOKEN_KEY, type AccessContext, type Artifact, type ArtifactCreateInput, type ArtifactListQuery, AuthProvider, type AuthProviderProps, type AxiosAIWorkflowOptions, ClayxToast, DefaultErrorFallback, type EmailLoginRequest, type EmailLoginResponse, ErrorBoundary, FloatingButton, GlobalToastContainer, HowoneProvider, type HowoneProviderProps, Loading, LoadingSpinner, LoginForm, type SendCodeRequest, type SendCodeResponse, ThemeProvider, ThemeToggle, type Visibility, aiRequest, aiWorkflow, canAccessArtifact, createAIWorkflowClient, createAIWorkflowClientAxios, createArtifactsClient, createClient, getAuthRoot, getCodeStatus, getDefaultProjectId, getToken, howone, injectEarlyErrorHandler, isTokenValid, loginWithEmailCode, onAuthStateChanged, parseUserFromToken, request, sendEmailVerificationCode, setAuthRoot, setDefaultProjectId, setToken, unifiedAuth, unifiedOAuth, useAuth, useAuthContext, useDebounce, useIsMobile, useTheme, workflowRequest };
|
package/dist/index.d.ts
CHANGED
|
@@ -423,19 +423,48 @@ interface LoginFormProps {
|
|
|
423
423
|
}
|
|
424
424
|
declare const LoginForm: React$1.FC<LoginFormProps>;
|
|
425
425
|
|
|
426
|
+
type Theme$1 = "dark" | "light" | "system";
|
|
426
427
|
type AuthContextValue = {
|
|
427
428
|
user: ReturnType<typeof parseUserFromToken> | null;
|
|
428
429
|
token: string | null;
|
|
429
430
|
isAuthenticated: boolean;
|
|
430
431
|
logout: () => void;
|
|
431
432
|
};
|
|
432
|
-
|
|
433
|
+
interface HowoneProviderProps {
|
|
433
434
|
children: React$1.ReactNode;
|
|
434
435
|
autoRedirect?: boolean;
|
|
435
436
|
showFloatingButton?: boolean;
|
|
436
437
|
projectId?: string;
|
|
437
|
-
|
|
438
|
+
/** 主题相关配置 */
|
|
439
|
+
defaultTheme?: Theme$1;
|
|
440
|
+
themeStorageKey?: string;
|
|
441
|
+
/** 如果为 true,将忽略 localStorage 中的值,始终使用 defaultTheme */
|
|
442
|
+
forceDefaultTheme?: boolean;
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* HowoneProvider - All-in-one application provider
|
|
446
|
+
*
|
|
447
|
+
* Includes:
|
|
448
|
+
* - Authentication management
|
|
449
|
+
* - Theme management (dark/light/system)
|
|
450
|
+
* - Toast notifications
|
|
451
|
+
* - Floating button
|
|
452
|
+
*
|
|
453
|
+
* @example
|
|
454
|
+
* ```tsx
|
|
455
|
+
* <HowoneProvider
|
|
456
|
+
* defaultTheme="dark"
|
|
457
|
+
* themeStorageKey="my-app-theme"
|
|
458
|
+
* showFloatingButton={true}
|
|
459
|
+
* >
|
|
460
|
+
* <App />
|
|
461
|
+
* </HowoneProvider>
|
|
462
|
+
* ```
|
|
463
|
+
*/
|
|
464
|
+
declare const HowoneProvider: React$1.FC<HowoneProviderProps>;
|
|
438
465
|
declare function useAuthContext(): AuthContextValue;
|
|
466
|
+
declare const AuthProvider: React$1.FC<HowoneProviderProps>;
|
|
467
|
+
type AuthProviderProps = HowoneProviderProps;
|
|
439
468
|
|
|
440
469
|
type AuthState = {
|
|
441
470
|
user: Record<string, unknown> | null;
|
|
@@ -504,12 +533,13 @@ type ThemeProviderProps = {
|
|
|
504
533
|
children: React.ReactNode;
|
|
505
534
|
defaultTheme?: Theme;
|
|
506
535
|
storageKey?: string;
|
|
536
|
+
forceDefault?: boolean;
|
|
507
537
|
};
|
|
508
538
|
type ThemeProviderState = {
|
|
509
539
|
theme: Theme;
|
|
510
540
|
setTheme: (theme: Theme) => void;
|
|
511
541
|
};
|
|
512
|
-
declare function ThemeProvider({ children, defaultTheme, storageKey, ...props }: ThemeProviderProps): react_jsx_runtime.JSX.Element;
|
|
542
|
+
declare function ThemeProvider({ children, defaultTheme, storageKey, forceDefault, ...props }: ThemeProviderProps): react_jsx_runtime.JSX.Element;
|
|
513
543
|
declare const useTheme: () => ThemeProviderState;
|
|
514
544
|
|
|
515
545
|
interface ThemeToggleProps {
|
|
@@ -543,4 +573,4 @@ declare function useDebounce<T>(value: T, delay: number): T;
|
|
|
543
573
|
*/
|
|
544
574
|
declare function injectEarlyErrorHandler(): void;
|
|
545
575
|
|
|
546
|
-
export { type AIWorkflowClientOptions, type AIWorkflowResponse, AUTH_ROOT, AUTH_TOKEN_KEY, type AccessContext, type Artifact, type ArtifactCreateInput, type ArtifactListQuery, AuthProvider, type AxiosAIWorkflowOptions, ClayxToast, DefaultErrorFallback, type EmailLoginRequest, type EmailLoginResponse, ErrorBoundary, FloatingButton, GlobalToastContainer, Loading, LoadingSpinner, LoginForm, type SendCodeRequest, type SendCodeResponse, ThemeProvider, ThemeToggle, type Visibility, aiRequest, aiWorkflow, canAccessArtifact, createAIWorkflowClient, createAIWorkflowClientAxios, createArtifactsClient, createClient, getAuthRoot, getCodeStatus, getDefaultProjectId, getToken, howone, injectEarlyErrorHandler, isTokenValid, loginWithEmailCode, onAuthStateChanged, parseUserFromToken, request, sendEmailVerificationCode, setAuthRoot, setDefaultProjectId, setToken, unifiedAuth, unifiedOAuth, useAuth, useAuthContext, useDebounce, useIsMobile, useTheme, workflowRequest };
|
|
576
|
+
export { type AIWorkflowClientOptions, type AIWorkflowResponse, AUTH_ROOT, AUTH_TOKEN_KEY, type AccessContext, type Artifact, type ArtifactCreateInput, type ArtifactListQuery, AuthProvider, type AuthProviderProps, type AxiosAIWorkflowOptions, ClayxToast, DefaultErrorFallback, type EmailLoginRequest, type EmailLoginResponse, ErrorBoundary, FloatingButton, GlobalToastContainer, HowoneProvider, type HowoneProviderProps, Loading, LoadingSpinner, LoginForm, type SendCodeRequest, type SendCodeResponse, ThemeProvider, ThemeToggle, type Visibility, aiRequest, aiWorkflow, canAccessArtifact, createAIWorkflowClient, createAIWorkflowClientAxios, createArtifactsClient, createClient, getAuthRoot, getCodeStatus, getDefaultProjectId, getToken, howone, injectEarlyErrorHandler, isTokenValid, loginWithEmailCode, onAuthStateChanged, parseUserFromToken, request, sendEmailVerificationCode, setAuthRoot, setDefaultProjectId, setToken, unifiedAuth, unifiedOAuth, useAuth, useAuthContext, useDebounce, useIsMobile, useTheme, workflowRequest };
|
package/dist/index.js
CHANGED
|
@@ -241,6 +241,7 @@ __export(index_exports, {
|
|
|
241
241
|
ErrorBoundary: () => ErrorBoundary,
|
|
242
242
|
FloatingButton: () => FloatingButton,
|
|
243
243
|
GlobalToastContainer: () => GlobalToastContainer,
|
|
244
|
+
HowoneProvider: () => HowoneProvider,
|
|
244
245
|
Loading: () => Loading,
|
|
245
246
|
LoadingSpinner: () => LoadingSpinner,
|
|
246
247
|
LoginForm: () => LoginForm,
|
|
@@ -292,7 +293,7 @@ var FloatingButton = ({
|
|
|
292
293
|
{
|
|
293
294
|
onClick,
|
|
294
295
|
id: "floating-howone-btn",
|
|
295
|
-
className: `fixed flex bg-
|
|
296
|
+
className: `fixed flex bg-background gap-2 items-center right-4 z-50 text-black dark:text-white px-3 py-2 rounded-lg shadow-lg transition-colors duration-200 border border-gray-200 dark:border-gray-700 ${className}`,
|
|
296
297
|
style: {
|
|
297
298
|
fontSize: "14px",
|
|
298
299
|
fontWeight: "bold",
|
|
@@ -1558,13 +1559,87 @@ var LoginForm = ({
|
|
|
1558
1559
|
};
|
|
1559
1560
|
|
|
1560
1561
|
// src/components/auth/AuthProvider.tsx
|
|
1561
|
-
var
|
|
1562
|
+
var import_react5 = require("react");
|
|
1562
1563
|
init_auth();
|
|
1564
|
+
|
|
1565
|
+
// src/components/theme/ThemeProvider.tsx
|
|
1566
|
+
var import_react4 = require("react");
|
|
1563
1567
|
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
1564
|
-
var
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
+
var initialState = {
|
|
1569
|
+
theme: "system",
|
|
1570
|
+
setTheme: () => null
|
|
1571
|
+
};
|
|
1572
|
+
var ThemeProviderContext = (0, import_react4.createContext)(initialState);
|
|
1573
|
+
function ThemeProvider({
|
|
1574
|
+
children,
|
|
1575
|
+
defaultTheme = "system",
|
|
1576
|
+
storageKey = "vite-ui-theme",
|
|
1577
|
+
forceDefault = false,
|
|
1578
|
+
...props
|
|
1579
|
+
}) {
|
|
1580
|
+
const [theme, setTheme] = (0, import_react4.useState)(() => {
|
|
1581
|
+
if (forceDefault) {
|
|
1582
|
+
localStorage.setItem(storageKey, defaultTheme);
|
|
1583
|
+
return defaultTheme;
|
|
1584
|
+
}
|
|
1585
|
+
const stored = localStorage.getItem(storageKey);
|
|
1586
|
+
const initialTheme = stored || defaultTheme;
|
|
1587
|
+
if (!stored) {
|
|
1588
|
+
localStorage.setItem(storageKey, defaultTheme);
|
|
1589
|
+
}
|
|
1590
|
+
return initialTheme;
|
|
1591
|
+
});
|
|
1592
|
+
(0, import_react4.useEffect)(() => {
|
|
1593
|
+
const root = window.document.documentElement;
|
|
1594
|
+
root.classList.remove("light", "dark");
|
|
1595
|
+
if (theme === "system") {
|
|
1596
|
+
const systemTheme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
|
|
1597
|
+
root.classList.add(systemTheme);
|
|
1598
|
+
return;
|
|
1599
|
+
}
|
|
1600
|
+
root.classList.add(theme);
|
|
1601
|
+
}, [theme]);
|
|
1602
|
+
const value = {
|
|
1603
|
+
theme,
|
|
1604
|
+
setTheme: (theme2) => {
|
|
1605
|
+
localStorage.setItem(storageKey, theme2);
|
|
1606
|
+
setTheme(theme2);
|
|
1607
|
+
}
|
|
1608
|
+
};
|
|
1609
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(ThemeProviderContext.Provider, { ...props, value, children });
|
|
1610
|
+
}
|
|
1611
|
+
var useTheme = () => {
|
|
1612
|
+
const context = (0, import_react4.useContext)(ThemeProviderContext);
|
|
1613
|
+
if (context === void 0)
|
|
1614
|
+
throw new Error("useTheme must be used within a ThemeProvider");
|
|
1615
|
+
return context;
|
|
1616
|
+
};
|
|
1617
|
+
|
|
1618
|
+
// src/components/ui/Toast/GlobalToastContainer.tsx
|
|
1619
|
+
var import_react_toastify = require("react-toastify");
|
|
1620
|
+
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
1621
|
+
function GlobalToastContainer() {
|
|
1622
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1623
|
+
import_react_toastify.ToastContainer,
|
|
1624
|
+
{
|
|
1625
|
+
newestOnTop: false,
|
|
1626
|
+
closeButton: false
|
|
1627
|
+
}
|
|
1628
|
+
);
|
|
1629
|
+
}
|
|
1630
|
+
|
|
1631
|
+
// src/components/auth/AuthProvider.tsx
|
|
1632
|
+
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
1633
|
+
var AuthContext = (0, import_react5.createContext)(null);
|
|
1634
|
+
var HowoneProvider = ({
|
|
1635
|
+
children,
|
|
1636
|
+
showFloatingButton = true,
|
|
1637
|
+
defaultTheme = "system",
|
|
1638
|
+
themeStorageKey = "howone-theme",
|
|
1639
|
+
forceDefaultTheme = false
|
|
1640
|
+
}) => {
|
|
1641
|
+
const [user, setUser] = (0, import_react5.useState)(() => parseUserFromToken(getToken()));
|
|
1642
|
+
const [token, setTokenState] = (0, import_react5.useState)(() => getToken());
|
|
1568
1643
|
const logout = () => {
|
|
1569
1644
|
try {
|
|
1570
1645
|
setToken(null);
|
|
@@ -1579,13 +1654,24 @@ var AuthProvider = ({ children, showFloatingButton = true }) => {
|
|
|
1579
1654
|
isAuthenticated: !!token,
|
|
1580
1655
|
logout
|
|
1581
1656
|
};
|
|
1582
|
-
return /* @__PURE__ */ (0,
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1657
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
1658
|
+
ThemeProvider,
|
|
1659
|
+
{
|
|
1660
|
+
defaultTheme,
|
|
1661
|
+
storageKey: themeStorageKey,
|
|
1662
|
+
forceDefault: forceDefaultTheme,
|
|
1663
|
+
children: [
|
|
1664
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(AuthContext.Provider, { value, children: [
|
|
1665
|
+
children,
|
|
1666
|
+
showFloatingButton && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(FloatingButton, { onClick: () => window.open("https://howone.ai", "_blank") })
|
|
1667
|
+
] }),
|
|
1668
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(GlobalToastContainer, {})
|
|
1669
|
+
]
|
|
1670
|
+
}
|
|
1671
|
+
);
|
|
1586
1672
|
};
|
|
1587
1673
|
function useAuthContext() {
|
|
1588
|
-
const ctx = (0,
|
|
1674
|
+
const ctx = (0, import_react5.useContext)(AuthContext);
|
|
1589
1675
|
if (!ctx) {
|
|
1590
1676
|
const t = getToken();
|
|
1591
1677
|
return {
|
|
@@ -1602,6 +1688,7 @@ function useAuthContext() {
|
|
|
1602
1688
|
}
|
|
1603
1689
|
return ctx;
|
|
1604
1690
|
}
|
|
1691
|
+
var AuthProvider = HowoneProvider;
|
|
1605
1692
|
|
|
1606
1693
|
// src/components/index.ts
|
|
1607
1694
|
init_auth();
|
|
@@ -1689,7 +1776,7 @@ var howone = {
|
|
|
1689
1776
|
var client_default = howone;
|
|
1690
1777
|
|
|
1691
1778
|
// src/components/ui/Loading.tsx
|
|
1692
|
-
var
|
|
1779
|
+
var import_jsx_runtime6 = require("react/jsx-runtime");
|
|
1693
1780
|
var Loading = ({
|
|
1694
1781
|
size = "md",
|
|
1695
1782
|
text = "Loading...",
|
|
@@ -1702,14 +1789,14 @@ var Loading = ({
|
|
|
1702
1789
|
lg: "h-12 w-12"
|
|
1703
1790
|
};
|
|
1704
1791
|
const containerClasses = fullScreen ? "fixed inset-0 flex items-center justify-center bg-white/80 backdrop-blur-sm z-50" : "flex items-center justify-center p-4";
|
|
1705
|
-
return /* @__PURE__ */ (0,
|
|
1706
|
-
/* @__PURE__ */ (0,
|
|
1792
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: `${containerClasses} ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "text-center", children: [
|
|
1793
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
1707
1794
|
"div",
|
|
1708
1795
|
{
|
|
1709
1796
|
className: `animate-spin rounded-full border-2 border-gray-300 border-t-blue-600 mx-auto ${sizeClasses[size]}`
|
|
1710
1797
|
}
|
|
1711
1798
|
),
|
|
1712
|
-
text && /* @__PURE__ */ (0,
|
|
1799
|
+
text && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mt-2 text-sm text-gray-600", children: text })
|
|
1713
1800
|
] }) });
|
|
1714
1801
|
};
|
|
1715
1802
|
var LoadingSpinner = ({
|
|
@@ -1721,7 +1808,7 @@ var LoadingSpinner = ({
|
|
|
1721
1808
|
md: "h-8 w-8",
|
|
1722
1809
|
lg: "h-12 w-12"
|
|
1723
1810
|
};
|
|
1724
|
-
return /* @__PURE__ */ (0,
|
|
1811
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
1725
1812
|
"div",
|
|
1726
1813
|
{
|
|
1727
1814
|
className: `animate-spin rounded-full border-2 border-gray-300 border-t-blue-600 ${sizeClasses[size]} ${className}`
|
|
@@ -1730,9 +1817,9 @@ var LoadingSpinner = ({
|
|
|
1730
1817
|
};
|
|
1731
1818
|
|
|
1732
1819
|
// src/components/ui/ErrorBoundary.tsx
|
|
1733
|
-
var
|
|
1734
|
-
var
|
|
1735
|
-
var ErrorBoundary = class extends
|
|
1820
|
+
var import_react6 = require("react");
|
|
1821
|
+
var import_jsx_runtime7 = require("react/jsx-runtime");
|
|
1822
|
+
var ErrorBoundary = class extends import_react6.Component {
|
|
1736
1823
|
constructor(props) {
|
|
1737
1824
|
super(props);
|
|
1738
1825
|
this.handleRetry = () => {
|
|
@@ -1754,13 +1841,13 @@ var ErrorBoundary = class extends import_react5.Component {
|
|
|
1754
1841
|
if (this.state.hasError) {
|
|
1755
1842
|
if (this.props.fallback) {
|
|
1756
1843
|
const FallbackComponent = this.props.fallback;
|
|
1757
|
-
return /* @__PURE__ */ (0,
|
|
1844
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(FallbackComponent, { error: this.state.error, retry: this.handleRetry });
|
|
1758
1845
|
}
|
|
1759
|
-
return /* @__PURE__ */ (0,
|
|
1760
|
-
/* @__PURE__ */ (0,
|
|
1761
|
-
/* @__PURE__ */ (0,
|
|
1762
|
-
/* @__PURE__ */ (0,
|
|
1763
|
-
/* @__PURE__ */ (0,
|
|
1846
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "min-h-[400px] flex items-center justify-center p-4", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "text-center max-w-md", children: [
|
|
1847
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "text-red-500 text-6xl mb-4", children: "\u26A0\uFE0F" }),
|
|
1848
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h2", { className: "text-xl font-semibold text-gray-900 mb-2", children: "Something went wrong" }),
|
|
1849
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "text-gray-600 mb-4", children: "An unexpected error occurred. Please try refreshing the page." }),
|
|
1850
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
1764
1851
|
"button",
|
|
1765
1852
|
{
|
|
1766
1853
|
onClick: this.handleRetry,
|
|
@@ -1774,10 +1861,10 @@ var ErrorBoundary = class extends import_react5.Component {
|
|
|
1774
1861
|
return this.props.children;
|
|
1775
1862
|
}
|
|
1776
1863
|
};
|
|
1777
|
-
var DefaultErrorFallback = ({ retry }) => /* @__PURE__ */ (0,
|
|
1778
|
-
/* @__PURE__ */ (0,
|
|
1779
|
-
/* @__PURE__ */ (0,
|
|
1780
|
-
retry && /* @__PURE__ */ (0,
|
|
1864
|
+
var DefaultErrorFallback = ({ retry }) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "min-h-[200px] flex items-center justify-center p-4", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "text-center", children: [
|
|
1865
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "text-red-500 text-4xl mb-2", children: "\u26A0\uFE0F" }),
|
|
1866
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "text-gray-600 mb-2", children: "Something went wrong" }),
|
|
1867
|
+
retry && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
1781
1868
|
"button",
|
|
1782
1869
|
{
|
|
1783
1870
|
onClick: retry,
|
|
@@ -1787,54 +1874,11 @@ var DefaultErrorFallback = ({ retry }) => /* @__PURE__ */ (0, import_jsx_runtime
|
|
|
1787
1874
|
)
|
|
1788
1875
|
] }) });
|
|
1789
1876
|
|
|
1790
|
-
// src/components/theme/ThemeProvider.tsx
|
|
1791
|
-
var import_react6 = require("react");
|
|
1792
|
-
var import_jsx_runtime6 = require("react/jsx-runtime");
|
|
1793
|
-
var initialState = {
|
|
1794
|
-
theme: "system",
|
|
1795
|
-
setTheme: () => null
|
|
1796
|
-
};
|
|
1797
|
-
var ThemeProviderContext = (0, import_react6.createContext)(initialState);
|
|
1798
|
-
function ThemeProvider({
|
|
1799
|
-
children,
|
|
1800
|
-
defaultTheme = "system",
|
|
1801
|
-
storageKey = "vite-ui-theme",
|
|
1802
|
-
...props
|
|
1803
|
-
}) {
|
|
1804
|
-
const [theme, setTheme] = (0, import_react6.useState)(
|
|
1805
|
-
() => localStorage.getItem(storageKey) || defaultTheme
|
|
1806
|
-
);
|
|
1807
|
-
(0, import_react6.useEffect)(() => {
|
|
1808
|
-
const root = window.document.documentElement;
|
|
1809
|
-
root.classList.remove("light", "dark");
|
|
1810
|
-
if (theme === "system") {
|
|
1811
|
-
const systemTheme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
|
|
1812
|
-
root.classList.add(systemTheme);
|
|
1813
|
-
return;
|
|
1814
|
-
}
|
|
1815
|
-
root.classList.add(theme);
|
|
1816
|
-
}, [theme]);
|
|
1817
|
-
const value = {
|
|
1818
|
-
theme,
|
|
1819
|
-
setTheme: (theme2) => {
|
|
1820
|
-
localStorage.setItem(storageKey, theme2);
|
|
1821
|
-
setTheme(theme2);
|
|
1822
|
-
}
|
|
1823
|
-
};
|
|
1824
|
-
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ThemeProviderContext.Provider, { ...props, value, children });
|
|
1825
|
-
}
|
|
1826
|
-
var useTheme = () => {
|
|
1827
|
-
const context = (0, import_react6.useContext)(ThemeProviderContext);
|
|
1828
|
-
if (context === void 0)
|
|
1829
|
-
throw new Error("useTheme must be used within a ThemeProvider");
|
|
1830
|
-
return context;
|
|
1831
|
-
};
|
|
1832
|
-
|
|
1833
1877
|
// src/components/theme/ThemeToggle.tsx
|
|
1834
1878
|
var React4 = __toESM(require("react"));
|
|
1835
1879
|
var import_next_themes = require("next-themes");
|
|
1836
1880
|
var import_react7 = require("@iconify/react");
|
|
1837
|
-
var
|
|
1881
|
+
var import_jsx_runtime8 = require("react/jsx-runtime");
|
|
1838
1882
|
function ThemeToggle({ className }) {
|
|
1839
1883
|
const { setTheme, theme } = (0, import_next_themes.useTheme)();
|
|
1840
1884
|
const [mounted, setMounted] = React4.useState(false);
|
|
@@ -1842,44 +1886,31 @@ function ThemeToggle({ className }) {
|
|
|
1842
1886
|
setMounted(true);
|
|
1843
1887
|
}, []);
|
|
1844
1888
|
if (!mounted) {
|
|
1845
|
-
return /* @__PURE__ */ (0,
|
|
1889
|
+
return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
|
|
1846
1890
|
"button",
|
|
1847
1891
|
{
|
|
1848
1892
|
className: `relative inline-flex h-10 w-12 items-center justify-center rounded-md border border-input bg-background hover:bg-accent hover:text-accent-foreground ${className || ""}`,
|
|
1849
1893
|
disabled: true,
|
|
1850
1894
|
children: [
|
|
1851
|
-
/* @__PURE__ */ (0,
|
|
1852
|
-
/* @__PURE__ */ (0,
|
|
1895
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react7.Icon, { icon: "solar:sun-2-linear", width: 20, height: 20 }),
|
|
1896
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "sr-only", children: "Toggle theme" })
|
|
1853
1897
|
]
|
|
1854
1898
|
}
|
|
1855
1899
|
);
|
|
1856
1900
|
}
|
|
1857
|
-
return /* @__PURE__ */ (0,
|
|
1901
|
+
return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
|
|
1858
1902
|
"button",
|
|
1859
1903
|
{
|
|
1860
1904
|
className: `inline-flex h-10 w-12 items-center justify-center rounded-md border border-input bg-background hover:bg-accent hover:text-accent-foreground transition-colors ${className || ""}`,
|
|
1861
1905
|
onClick: () => setTheme(theme === "light" ? "dark" : "light"),
|
|
1862
1906
|
children: [
|
|
1863
|
-
theme === "light" ? /* @__PURE__ */ (0,
|
|
1864
|
-
/* @__PURE__ */ (0,
|
|
1907
|
+
theme === "light" ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react7.Icon, { icon: "solar:sun-2-linear", width: 20, height: 20 }) : /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react7.Icon, { icon: "solar:moon-linear", width: 20, height: 20 }),
|
|
1908
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "sr-only", children: "Toggle theme" })
|
|
1865
1909
|
]
|
|
1866
1910
|
}
|
|
1867
1911
|
);
|
|
1868
1912
|
}
|
|
1869
1913
|
|
|
1870
|
-
// src/components/ui/Toast/GlobalToastContainer.tsx
|
|
1871
|
-
var import_react_toastify = require("react-toastify");
|
|
1872
|
-
var import_jsx_runtime8 = require("react/jsx-runtime");
|
|
1873
|
-
function GlobalToastContainer() {
|
|
1874
|
-
return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
1875
|
-
import_react_toastify.ToastContainer,
|
|
1876
|
-
{
|
|
1877
|
-
newestOnTop: false,
|
|
1878
|
-
closeButton: false
|
|
1879
|
-
}
|
|
1880
|
-
);
|
|
1881
|
-
}
|
|
1882
|
-
|
|
1883
1914
|
// src/components/ui/Toast/ClayxToast.tsx
|
|
1884
1915
|
var import_react8 = __toESM(require("react"));
|
|
1885
1916
|
var import_react_toastify2 = require("react-toastify");
|
|
@@ -2425,6 +2456,7 @@ init_config();
|
|
|
2425
2456
|
ErrorBoundary,
|
|
2426
2457
|
FloatingButton,
|
|
2427
2458
|
GlobalToastContainer,
|
|
2459
|
+
HowoneProvider,
|
|
2428
2460
|
Loading,
|
|
2429
2461
|
LoadingSpinner,
|
|
2430
2462
|
LoginForm,
|