由 zinc 出售

OpenCloud is a modular, Go-based cloud storage and collaboration backend composed of microservices covering authentication, file storage, search, sharing, antivirus, and federated access. Designed for self-hosted deployments from single-node to large-scale Kubernetes clusters.
This block is the React/Redux frontend for the OpenCloud embedded identity provider (LibreGraph Connect / Konnect). It renders the login, welcome, and goodbye screens used during OpenID Connect flows, handles credential validation errors, and supports i18n. The typical buyer is a developer integrating a self-hosted OpenID Connect login UI into an existing Node.js or React application.
services/idp/src/index.tsx - Application entry point; mounts the Redux-connected React app into the DOMservices/idp/src/App - Root application component (imported by index.tsx)services/idp/src/store - Redux store configurationservices/idp/src/containers/Login/ - Login screen container, exported as default from Loginscreenservices/idp/src/containers/Welcome/ - Welcome screen container, exported as default from Welcomescreenservices/idp/src/containers/Goodbye/ - Goodbye/logout screen container, exported as default from Goodbyescreenservices/idp/src/errors/index.js - Error constants, ExtendedError class, and ErrorMessageComponent for i18n-aware error renderingservices/idp/src/i18n - i18n initialization (imported as side-effect in index.tsx)services/idp/src/app.css - Global styles for the IDP UInpm install react react-dom react-redux redux
npm install react-i18next i18next
npm install prop-types
No native modules, pod installs, or Expo prebuild steps are required. This is a pure browser-targeted React application. If embedding in an Expo/React Native project, additional web compatibility shims are needed (see pitfalls).
Copy source/services/idp/src/ into your project, e.g. src/idp/.
Ensure your tsconfig.json includes JSX support:
{
"compilerOptions": {
"jsx": "react",
"allowJs": true,
"esModuleInterop": true,
"moduleResolution": "node"
}
}
If using Babel, confirm @babel/preset-react and @babel/preset-typescript are active in your config.
启动隔离沙箱并在服务器端直接运行 — 无需本地配置。
此版本的 Tetrees AI Review
This React web app completed archive review with strong static results. Structure, dependency manifests, documentation, functional source, and common risk patterns were checked by the Tetrees verification pipeline; runtime phases are stated separately.
Deterministic AVCP artifact review
管道 avcp-2026-08-04.1 · SHA-256 faa017fd744635b5…
This version-scoped review deterministically inspects the submitted archive for structure, dependencies, documentation, functional source, and common malicious or high-risk signals. Build and test phases are reported as passed only after an isolated sandbox audition. It is not a guarantee of perfect security.
审查日期 2026年8月4日
将此产品直接导入你的 AI IDE、网页构建器或云端 IDE。
将 Tetrees 连接到兼容的 AI IDE,列出你拥有的产品并获取已验证 ZIP,同时不会开放卖家上传权限。
暂无评价。
Sign in to join the discussion
Loading discussion…
Wire path aliases if you moved files:
{
"compilerOptions": {
"paths": {
"@idp/*": ["src/idp/*"]
}
}
}
Provide a root DOM element with id="root" in your HTML. Optionally set data-bg-img on it to supply a custom background image URL:
<div id="root" data-bg-img="/assets/bg.jpg"></div>
No required environment variables for the frontend itself. If connecting to the actual Konnect backend, set the OIDC provider URL in your server config (KONNECT_IDENTIFIER_BACKEND, etc.) - these are server-side only.
Import and run index.tsx as your entry point, or individually import containers for embedding within a larger app.
import { ExtendedError } from './src/idp/errors';
class ExtendedError extends Error {
values: Record<string, unknown> | undefined;
constructor(message: string, values?: Record<string, unknown>);
}
Use ExtendedError when you need to attach structured interpolation values to an error (e.g., HTTP status codes, state strings) that will later be rendered by ErrorMessageComponent. Pass values as the second argument; they are merged with any values on the message descriptor during rendering.
import {
ERROR_LOGIN_VALIDATE_MISSINGUSERNAME,
ERROR_LOGIN_VALIDATE_MISSINGPASSWORD,
ERROR_LOGIN_FAILED,
ERROR_HTTP_NETWORK_ERROR,
ERROR_HTTP_UNEXPECTED_RESPONSE_STATUS,
ERROR_HTTP_UNEXPECTED_RESPONSE_STATE,
} from './src/idp/errors';
// All are string constants, e.g.:
// ERROR_LOGIN_FAILED === 'konnect.error.login.failed'
Use these constants as error identifiers in Redux actions or thrown ExtendedError instances. They are matched inside ErrorMessageComponent to produce translated human-readable messages. Never hard-code the string values; always import the constant.
withTranslation)import { ErrorMessageComponent } from './src/idp/errors';
// Props:
// error: Error | ExtendedError | { id?: string; message: string; values?: object }
// values?: Record<string, unknown> (merged on top of error.values)
// t: TFunction (injected by react-i18next HOC wrapping)
Render this component inside any form that produces login or HTTP errors. It handles all known konnect.error.* keys and falls back to a raw translation call for unknown messages. Wrap it with withTranslation from react-i18next before use, or use the already-wrapped export.
Embed the Login container in an existing React app without the full index.tsx bootstrap.
import React from 'react';
import { Provider } from 'react-redux';
import store from './src/idp/store';
import Loginscreen from './src/idp/containers/Login';
export function IDPLoginPage() {
return (
<Provider store={store as any}>
<Loginscreen />
</Provider>
);
}
Use ExtendedError and ERROR_LOGIN_FAILED to create a typed error, then render it via ErrorMessageComponent.
import React from 'react';
import { withTranslation, useTranslation } from 'react-i18next';
import { ExtendedError, ERROR_LOGIN_FAILED, ErrorMessageComponent } from './src/idp/errors';
const TranslatedError = withTranslation()(ErrorMessageComponent);
export function LoginForm() {
const [error, setError] = React.useState<ExtendedError | null>(null);
const handleSubmit = async () => {
try {
// simulate a failed login
throw new ExtendedError(ERROR_LOGIN_FAILED);
} catch (e) {
setError(e as ExtendedError);
}
};
return (
<div>
<button onClick={handleSubmit}>Login</button>
{error && <TranslatedError error={error} />}
</div>
);
}
import React from 'react';
import { withTranslation } from 'react-i18next';
import {
ExtendedError,
ERROR_HTTP_UNEXPECTED_RESPONSE_STATUS,
ErrorMessageComponent,
} from './src/idp/errors';
const TranslatedError = withTranslation()(ErrorMessageComponent);
async function fetchToken(): Promise<void> {
const res = await fetch('/konnect/v1/token');
if (res.status !== 200) {
throw new ExtendedError(ERROR_HTTP_UNEXPECTED_RESPONSE_STATUS, { status: res.status });
}
}
export function TokenButton() {
const [err, setErr] = React.useState<ExtendedError | null>(null);
return (
<div>
<button onClick={() => fetchToken().catch(setErr)}>Get Token</button>
{err && <TranslatedError error={err} />}
</div>
);
}
services/idp/src/index.tsx - Bootstraps React into #root, reads data-bg-img attribute, wraps app in Redux Provider and React.StrictMode.services/idp/src/containers/Login/index.js - Re-exports Loginscreen; the primary credential entry UI shown during an OIDC authorization request.services/idp/src/containers/Welcome/index.js - Re-exports Welcomescreen; shown after successful authentication/consent.services/idp/src/containers/Goodbye/index.js - Re-exports Goodbyescreen; shown after logout or session termination.services/idp/src/errors/index.js - Exports all error constants, ExtendedError, and the i18n-aware ErrorMessageComponent. Central location for all IDP error handling.document.getElementById('root') returns null: Ensure your HTML has <div id="root"></div> before the script executes, or defer the script tag.withTranslation wrapping is required on ErrorMessageComponent: The component uses t as a prop injected by the HOC; importing and rendering it directly without withTranslation() will throw a "t is not a function" error.any: store is passed as store as any in index.tsx; if you have strict Redux typings, provide your own typed store or cast explicitly../i18n is imported as a side-effect in index.tsx; if you split the app, ensure the i18n import is at the top of your own entry file before any component renders.prop-types: If bundling with Rollup or a strict ESM setup, add prop-types to your external list or ensure your bundler handles CommonJS interop (@rollup/plugin-commonjs).data-bg-img must be set on the element with id="root", not on <body> or a wrapper; the code reads it specifically via root.getAttribute('data-bg-img').I have the OpenCloud backend IDP frontend source in `source/services/idp/src/`.
The USAGE.md file in the same directory contains full integration instructions.
Please help me integrate this into my existing React/TypeScript project step by step:
1. Read USAGE.md and the file excerpts under `source/services/idp/src/` to understand
the real exports: ExtendedError, ERROR_* constants, ErrorMessageComponent,
and the Login/Welcome/Goodbye screen containers.
2. Install all required npm dependencies listed in USAGE.md.
3. Embed the Login container into my existing `src/pages/LoginPage.tsx`, wrapping
it with the Redux Provider using the store from `source/services/idp/src/store`.
4. Wire up `ErrorMessageComponent` (via `withTranslation`) to display translated
login errors using the `ERROR_LOGIN_FAILED` and `ERROR_HTTP_NETWORK_ERROR` constants.
5. Ensure `i18n` is initialized (side-effect import) before any IDP component renders.
6. Show me the final `LoginPage.tsx` and any changes needed to `tsconfig.json`.
Do not invent any exports; use only what is documented in USAGE.md and visible in source/.
The OpenCloud backend server is released under the Apache 2.0 License. See source/LICENSE for the full text. Upstream project: opencloud-eu/opencloud on GitHub.
This product’s unique contribution is clean room implementation of valuable code block into AVCP compatible standard.
完整安装指南与集成提示词将在购买后解锁。
CRM, ERP, Admin & Internal Tools
US$13.89