@sudobility/devops-components-rn 1.0.0 → 1.0.2
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/AlertDialog.d.ts.map +1 -1
- package/dist/ApiPlayground.d.ts.map +1 -1
- package/dist/ApiReference.d.ts.map +1 -1
- package/dist/AuditLog.d.ts +26 -4
- package/dist/AuditLog.d.ts.map +1 -1
- package/dist/BodyMetrics.d.ts.map +1 -1
- package/dist/BuildLog.d.ts +16 -5
- package/dist/BuildLog.d.ts.map +1 -1
- package/dist/ChangelogDisplay.d.ts.map +1 -1
- package/dist/CodePlayground.d.ts.map +1 -1
- package/dist/ConflictResolver.d.ts.map +1 -1
- package/dist/DealPipeline.d.ts.map +1 -1
- package/dist/DeploymentStatus.d.ts +11 -4
- package/dist/DeploymentStatus.d.ts.map +1 -1
- package/dist/DriverLog.d.ts.map +1 -1
- package/dist/MemoryUsage.d.ts.map +1 -1
- package/dist/MetricsGrid.d.ts +12 -19
- package/dist/MetricsGrid.d.ts.map +1 -1
- package/dist/PipelineView.d.ts +21 -5
- package/dist/PipelineView.d.ts.map +1 -1
- package/dist/RegressionTest.d.ts.map +1 -1
- package/dist/SystemStatusIndicator.d.ts +9 -8
- package/dist/SystemStatusIndicator.d.ts.map +1 -1
- package/dist/TestResult.d.ts.map +1 -1
- package/dist/TestRunner.d.ts.map +1 -1
- package/dist/WebhookLogger.d.ts.map +1 -1
- package/dist/WorkflowBuilder.d.ts.map +1 -1
- package/dist/WorkflowTemplate.d.ts.map +1 -1
- package/dist/XmlParser.d.ts.map +1 -1
- package/dist/index.cjs +1002 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +6 -27
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +1002 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +9 -10
- package/src/AlertDialog.tsx +21 -16
- package/src/ApiPlayground.tsx +7 -3
- package/src/ApiReference.tsx +6 -2
- package/src/AuditLog.tsx +244 -21
- package/src/BodyMetrics.tsx +6 -2
- package/src/BuildLog.tsx +132 -26
- package/src/ChangelogDisplay.tsx +6 -2
- package/src/CodePlayground.tsx +7 -3
- package/src/ConflictResolver.tsx +7 -3
- package/src/DealPipeline.tsx +6 -2
- package/src/DeploymentStatus.tsx +159 -25
- package/src/DriverLog.tsx +4 -2
- package/src/MemoryUsage.tsx +6 -2
- package/src/MetricsGrid.tsx +99 -94
- package/src/PipelineView.tsx +225 -26
- package/src/RegressionTest.tsx +6 -2
- package/src/SystemStatusIndicator.tsx +70 -47
- package/src/TestResult.tsx +6 -2
- package/src/TestRunner.tsx +7 -3
- package/src/WebhookLogger.tsx +6 -2
- package/src/WorkflowBuilder.tsx +7 -3
- package/src/WorkflowTemplate.tsx +7 -3
- package/src/XmlParser.tsx +4 -2
- package/src/index.ts +41 -30
- package/src/nativewind.d.ts +3 -0
- package/dist/index.cjs.js +0 -1593
- package/dist/index.cjs.js.map +0 -1
- package/dist/index.esm.js +0 -1593
- package/dist/index.esm.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/react/jsx-runtime.js","../src/SystemStatusIndicator.tsx","../src/DeploymentStatus.tsx","../src/BuildLog.tsx","../src/MetricsGrid.tsx","../src/AuditLog.tsx","../src/PipelineView.tsx"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import React from 'react';\nimport { View, Text, Pressable } from 'react-native';\nimport { cn, Card } from '@sudobility/components-rn';\n\nexport type SystemStatus = 'operational' | 'degraded' | 'major-outage';\n\nexport interface SystemStatusIndicatorProps {\n status: SystemStatus;\n systemName: string;\n description?: string;\n lastChecked?: Date;\n onPress?: () => void;\n className?: string;\n}\n\nconst statusConfig: Record<\n SystemStatus,\n { color: string; darkColor: string; label: string }\n> = {\n operational: {\n color: 'bg-green-500',\n darkColor: 'dark:bg-green-400',\n label: 'Operational',\n },\n degraded: {\n color: 'bg-yellow-500',\n darkColor: 'dark:bg-yellow-400',\n label: 'Degraded',\n },\n 'major-outage': {\n color: 'bg-red-500',\n darkColor: 'dark:bg-red-400',\n label: 'Major Outage',\n },\n};\n\nexport const SystemStatusIndicator: React.FC<SystemStatusIndicatorProps> = ({\n status,\n systemName,\n description,\n lastChecked,\n onPress,\n className,\n}) => {\n const config = statusConfig[status];\n\n const content = (\n <Card className={cn('p-4', className)}>\n <View className='flex-row items-center'>\n <View\n className={cn(\n 'w-3 h-3 rounded-full mr-3',\n config.color,\n config.darkColor\n )}\n />\n <View className='flex-1'>\n <Text className='text-base font-semibold text-gray-900 dark:text-gray-100'>\n {systemName}\n </Text>\n <Text\n className={cn(\n 'text-sm',\n status === 'operational' && 'text-green-600 dark:text-green-400',\n status === 'degraded' && 'text-yellow-600 dark:text-yellow-400',\n status === 'major-outage' && 'text-red-600 dark:text-red-400'\n )}\n >\n {config.label}\n </Text>\n </View>\n </View>\n {description && (\n <Text className='mt-2 text-sm text-gray-600 dark:text-gray-400'>\n {description}\n </Text>\n )}\n {lastChecked && (\n <Text className='mt-2 text-xs text-gray-500 dark:text-gray-500'>\n Last checked: {lastChecked.toLocaleString()}\n </Text>\n )}\n </Card>\n );\n\n if (onPress) {\n return (\n <Pressable onPress={onPress} accessibilityRole='button'>\n {content}\n </Pressable>\n );\n }\n\n return content;\n};\n\nexport default SystemStatusIndicator;\n","import React from 'react';\nimport { View, Text, Pressable } from 'react-native';\nimport { cn, Card } from '@sudobility/components-rn';\n\nexport type DeploymentState =\n | 'pending'\n | 'building'\n | 'deploying'\n | 'success'\n | 'failed'\n | 'cancelled';\n\nexport interface DeploymentStatusProps {\n state: DeploymentState;\n environment: string;\n version: string;\n timestamp: Date;\n commitHash?: string;\n commitMessage?: string;\n duration?: number;\n onPress?: () => void;\n className?: string;\n}\n\nconst stateConfig: Record<\n DeploymentState,\n {\n color: string;\n bgColor: string;\n darkBgColor: string;\n label: string;\n icon: string;\n }\n> = {\n pending: {\n color: 'text-gray-600 dark:text-gray-400',\n bgColor: 'bg-gray-100',\n darkBgColor: 'dark:bg-gray-800',\n label: 'Pending',\n icon: '⏳',\n },\n building: {\n color: 'text-blue-600 dark:text-blue-400',\n bgColor: 'bg-blue-100',\n darkBgColor: 'dark:bg-blue-900',\n label: 'Building',\n icon: '🔨',\n },\n deploying: {\n color: 'text-purple-600 dark:text-purple-400',\n bgColor: 'bg-purple-100',\n darkBgColor: 'dark:bg-purple-900',\n label: 'Deploying',\n icon: '🚀',\n },\n success: {\n color: 'text-green-600 dark:text-green-400',\n bgColor: 'bg-green-100',\n darkBgColor: 'dark:bg-green-900',\n label: 'Success',\n icon: '✓',\n },\n failed: {\n color: 'text-red-600 dark:text-red-400',\n bgColor: 'bg-red-100',\n darkBgColor: 'dark:bg-red-900',\n label: 'Failed',\n icon: '✗',\n },\n cancelled: {\n color: 'text-orange-600 dark:text-orange-400',\n bgColor: 'bg-orange-100',\n darkBgColor: 'dark:bg-orange-900',\n label: 'Cancelled',\n icon: '⊘',\n },\n};\n\nconst formatDuration = (seconds: number): string => {\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n if (minutes < 60) return `${minutes}m ${remainingSeconds}s`;\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return `${hours}h ${remainingMinutes}m`;\n};\n\nexport const DeploymentStatus: React.FC<DeploymentStatusProps> = ({\n state,\n environment,\n version,\n timestamp,\n commitHash,\n commitMessage,\n duration,\n onPress,\n className,\n}) => {\n const config = stateConfig[state];\n\n const content = (\n <Card className={cn('p-4', className)}>\n <View className='flex-row items-start justify-between'>\n <View className='flex-1'>\n <View className='flex-row items-center'>\n <View\n className={cn(\n 'px-2 py-1 rounded-md mr-2',\n config.bgColor,\n config.darkBgColor\n )}\n >\n <Text className={cn('text-xs font-medium', config.color)}>\n {config.icon} {config.label}\n </Text>\n </View>\n <View className='bg-gray-100 dark:bg-gray-800 px-2 py-1 rounded-md'>\n <Text className='text-xs font-medium text-gray-700 dark:text-gray-300'>\n {environment}\n </Text>\n </View>\n </View>\n <Text className='mt-2 text-base font-semibold text-gray-900 dark:text-gray-100'>\n {version}\n </Text>\n {commitHash && (\n <Text className='mt-1 text-sm font-mono text-gray-600 dark:text-gray-400'>\n {commitHash.substring(0, 7)}\n </Text>\n )}\n {commitMessage && (\n <Text\n className='mt-1 text-sm text-gray-600 dark:text-gray-400'\n numberOfLines={2}\n >\n {commitMessage}\n </Text>\n )}\n </View>\n </View>\n <View className='flex-row items-center justify-between mt-3 pt-3 border-t border-gray-200 dark:border-gray-700'>\n <Text className='text-xs text-gray-500 dark:text-gray-500'>\n {timestamp.toLocaleString()}\n </Text>\n {duration !== undefined && (\n <Text className='text-xs text-gray-500 dark:text-gray-500'>\n Duration: {formatDuration(duration)}\n </Text>\n )}\n </View>\n </Card>\n );\n\n if (onPress) {\n return (\n <Pressable onPress={onPress} accessibilityRole='button'>\n {content}\n </Pressable>\n );\n }\n\n return content;\n};\n\nexport default DeploymentStatus;\n","import React from 'react';\nimport { View, Text, ScrollView } from 'react-native';\nimport { cn, Card } from '@sudobility/components-rn';\n\nexport type LogLevel = 'info' | 'warn' | 'error' | 'debug' | 'success';\n\nexport interface LogEntry {\n id: string;\n level: LogLevel;\n message: string;\n timestamp: Date;\n source?: string;\n}\n\nexport interface BuildLogProps {\n entries: LogEntry[];\n title?: string;\n maxHeight?: number;\n showTimestamp?: boolean;\n showSource?: boolean;\n className?: string;\n}\n\nconst levelConfig: Record<\n LogLevel,\n { color: string; bgColor: string; darkBgColor: string; prefix: string }\n> = {\n info: {\n color: 'text-blue-600 dark:text-blue-400',\n bgColor: 'bg-blue-50',\n darkBgColor: 'dark:bg-blue-950',\n prefix: 'INFO',\n },\n warn: {\n color: 'text-yellow-600 dark:text-yellow-400',\n bgColor: 'bg-yellow-50',\n darkBgColor: 'dark:bg-yellow-950',\n prefix: 'WARN',\n },\n error: {\n color: 'text-red-600 dark:text-red-400',\n bgColor: 'bg-red-50',\n darkBgColor: 'dark:bg-red-950',\n prefix: 'ERROR',\n },\n debug: {\n color: 'text-gray-600 dark:text-gray-400',\n bgColor: 'bg-gray-50',\n darkBgColor: 'dark:bg-gray-900',\n prefix: 'DEBUG',\n },\n success: {\n color: 'text-green-600 dark:text-green-400',\n bgColor: 'bg-green-50',\n darkBgColor: 'dark:bg-green-950',\n prefix: 'SUCCESS',\n },\n};\n\nconst formatTime = (date: Date): string => {\n return date.toLocaleTimeString('en-US', {\n hour12: false,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n};\n\nexport const BuildLog: React.FC<BuildLogProps> = ({\n entries,\n title,\n maxHeight = 400,\n showTimestamp = true,\n showSource = false,\n className,\n}) => {\n return (\n <Card className={cn('overflow-hidden', className)}>\n {title && (\n <View className='px-4 py-3 border-b border-gray-200 dark:border-gray-700'>\n <Text className='text-base font-semibold text-gray-900 dark:text-gray-100'>\n {title}\n </Text>\n </View>\n )}\n <ScrollView\n style={{ maxHeight }}\n className='bg-gray-900 dark:bg-black'\n showsVerticalScrollIndicator={true}\n >\n <View className='p-3'>\n {entries.map(entry => {\n const config = levelConfig[entry.level];\n return (\n <View\n key={entry.id}\n className={cn(\n 'flex-row flex-wrap py-1 px-2 mb-1 rounded',\n config.bgColor,\n config.darkBgColor\n )}\n >\n {showTimestamp && (\n <Text className='font-mono text-xs text-gray-500 dark:text-gray-500 mr-2'>\n [{formatTime(entry.timestamp)}]\n </Text>\n )}\n <Text\n className={cn(\n 'font-mono text-xs font-bold mr-2',\n config.color\n )}\n >\n [{config.prefix}]\n </Text>\n {showSource && entry.source && (\n <Text className='font-mono text-xs text-gray-400 dark:text-gray-600 mr-2'>\n [{entry.source}]\n </Text>\n )}\n <Text className='font-mono text-xs text-gray-200 dark:text-gray-300 flex-1'>\n {entry.message}\n </Text>\n </View>\n );\n })}\n </View>\n </ScrollView>\n <View className='px-4 py-2 bg-gray-800 dark:bg-gray-950 border-t border-gray-700'>\n <Text className='text-xs text-gray-400 dark:text-gray-500'>\n {entries.length} log entries\n </Text>\n </View>\n </Card>\n );\n};\n\nexport default BuildLog;\n","import React from 'react';\nimport { View, Text, Pressable } from 'react-native';\nimport { cn, Card } from '@sudobility/components-rn';\n\nexport interface Metric {\n id: string;\n label: string;\n value: number | string;\n unit?: string;\n change?: number;\n changeLabel?: string;\n icon?: React.ReactNode;\n}\n\nexport interface MetricsGridProps {\n metrics: Metric[];\n columns?: 1 | 2 | 3 | 4;\n onMetricPress?: (metric: Metric) => void;\n className?: string;\n}\n\nconst formatChange = (change: number): string => {\n const sign = change >= 0 ? '+' : '';\n return sign + change.toFixed(1) + '%';\n};\n\nexport const MetricsGrid: React.FC<MetricsGridProps> = ({\n metrics,\n columns = 2,\n onMetricPress,\n className,\n}) => {\n const columnWidthClass = {\n 1: 'w-full',\n 2: 'w-1/2',\n 3: 'w-1/3',\n 4: 'w-1/4',\n }[columns];\n\n return (\n <View className={cn('flex-row flex-wrap -m-1', className)}>\n {metrics.map(metric => {\n const content = (\n <Card className='p-4 m-1 flex-1'>\n <View className='flex-row items-start justify-between'>\n <View className='flex-1'>\n <Text className='text-sm text-gray-600 dark:text-gray-400 mb-1'>\n {metric.label}\n </Text>\n <View className='flex-row items-baseline'>\n <Text className='text-2xl font-bold text-gray-900 dark:text-gray-100'>\n {metric.value}\n </Text>\n {metric.unit && (\n <Text className='text-sm text-gray-500 dark:text-gray-500 ml-1'>\n {metric.unit}\n </Text>\n )}\n </View>\n {metric.change !== undefined && (\n <View className='flex-row items-center mt-2'>\n <View\n className={cn(\n 'px-1.5 py-0.5 rounded',\n metric.change >= 0\n ? 'bg-green-100 dark:bg-green-900'\n : 'bg-red-100 dark:bg-red-900'\n )}\n >\n <Text\n className={cn(\n 'text-xs font-medium',\n metric.change >= 0\n ? 'text-green-700 dark:text-green-300'\n : 'text-red-700 dark:text-red-300'\n )}\n >\n {formatChange(metric.change)}\n </Text>\n </View>\n {metric.changeLabel && (\n <Text className='text-xs text-gray-500 dark:text-gray-500 ml-2'>\n {metric.changeLabel}\n </Text>\n )}\n </View>\n )}\n </View>\n {metric.icon && <View className='ml-2'>{metric.icon}</View>}\n </View>\n </Card>\n );\n\n if (onMetricPress) {\n return (\n <View key={metric.id} className={columnWidthClass}>\n <Pressable\n onPress={() => onMetricPress(metric)}\n accessibilityRole='button'\n accessibilityLabel={\n metric.label + ': ' + metric.value + (metric.unit || '')\n }\n >\n {content}\n </Pressable>\n </View>\n );\n }\n\n return (\n <View key={metric.id} className={columnWidthClass}>\n {content}\n </View>\n );\n })}\n </View>\n );\n};\n\nexport default MetricsGrid;\n","import React from 'react';\nimport { View, Text, ScrollView, Pressable } from 'react-native';\nimport { cn, Card } from '@sudobility/components-rn';\n\nexport type AuditActionType =\n | 'create'\n | 'update'\n | 'delete'\n | 'login'\n | 'logout'\n | 'access'\n | 'export'\n | 'import'\n | 'approve'\n | 'reject'\n | 'deploy'\n | 'rollback';\n\nexport interface AuditEntry {\n id: string;\n action: AuditActionType;\n actor: {\n id: string;\n name: string;\n email?: string;\n avatar?: string;\n };\n resource: {\n type: string;\n id: string;\n name: string;\n };\n timestamp: Date;\n metadata?: Record<string, unknown>;\n ipAddress?: string;\n}\n\nexport interface AuditLogProps {\n entries: AuditEntry[];\n title?: string;\n maxHeight?: number;\n onEntryPress?: (entry: AuditEntry) => void;\n className?: string;\n}\n\nconst actionConfig: Record<\n AuditActionType,\n { color: string; bgColor: string; darkBgColor: string; icon: string }\n> = {\n create: {\n color: 'text-green-700 dark:text-green-300',\n bgColor: 'bg-green-100',\n darkBgColor: 'dark:bg-green-900',\n icon: '+',\n },\n update: {\n color: 'text-blue-700 dark:text-blue-300',\n bgColor: 'bg-blue-100',\n darkBgColor: 'dark:bg-blue-900',\n icon: '~',\n },\n delete: {\n color: 'text-red-700 dark:text-red-300',\n bgColor: 'bg-red-100',\n darkBgColor: 'dark:bg-red-900',\n icon: '-',\n },\n login: {\n color: 'text-purple-700 dark:text-purple-300',\n bgColor: 'bg-purple-100',\n darkBgColor: 'dark:bg-purple-900',\n icon: '→',\n },\n logout: {\n color: 'text-gray-700 dark:text-gray-300',\n bgColor: 'bg-gray-100',\n darkBgColor: 'dark:bg-gray-800',\n icon: '←',\n },\n access: {\n color: 'text-cyan-700 dark:text-cyan-300',\n bgColor: 'bg-cyan-100',\n darkBgColor: 'dark:bg-cyan-900',\n icon: '◉',\n },\n export: {\n color: 'text-orange-700 dark:text-orange-300',\n bgColor: 'bg-orange-100',\n darkBgColor: 'dark:bg-orange-900',\n icon: '↑',\n },\n import: {\n color: 'text-teal-700 dark:text-teal-300',\n bgColor: 'bg-teal-100',\n darkBgColor: 'dark:bg-teal-900',\n icon: '↓',\n },\n approve: {\n color: 'text-emerald-700 dark:text-emerald-300',\n bgColor: 'bg-emerald-100',\n darkBgColor: 'dark:bg-emerald-900',\n icon: '✓',\n },\n reject: {\n color: 'text-rose-700 dark:text-rose-300',\n bgColor: 'bg-rose-100',\n darkBgColor: 'dark:bg-rose-900',\n icon: '✗',\n },\n deploy: {\n color: 'text-indigo-700 dark:text-indigo-300',\n bgColor: 'bg-indigo-100',\n darkBgColor: 'dark:bg-indigo-900',\n icon: '▲',\n },\n rollback: {\n color: 'text-amber-700 dark:text-amber-300',\n bgColor: 'bg-amber-100',\n darkBgColor: 'dark:bg-amber-900',\n icon: '↺',\n },\n};\n\nconst formatTimestamp = (date: Date): string => {\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffMins < 1) return 'Just now';\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n return date.toLocaleDateString();\n};\n\nexport const AuditLog: React.FC<AuditLogProps> = ({\n entries,\n title,\n maxHeight = 500,\n onEntryPress,\n className,\n}) => {\n return (\n <Card className={cn('overflow-hidden', className)}>\n {title && (\n <View className='px-4 py-3 border-b border-gray-200 dark:border-gray-700'>\n <Text className='text-base font-semibold text-gray-900 dark:text-gray-100'>\n {title}\n </Text>\n </View>\n )}\n <ScrollView style={{ maxHeight }} showsVerticalScrollIndicator={true}>\n {entries.map((entry, index) => {\n const config = actionConfig[entry.action];\n const isLast = index === entries.length - 1;\n\n const content = (\n <View\n className={cn(\n 'px-4 py-3',\n !isLast && 'border-b border-gray-100 dark:border-gray-800'\n )}\n >\n <View className='flex-row items-start'>\n <View\n className={cn(\n 'w-8 h-8 rounded-full items-center justify-center mr-3',\n config.bgColor,\n config.darkBgColor\n )}\n >\n <Text className={cn('text-sm font-bold', config.color)}>\n {config.icon}\n </Text>\n </View>\n <View className='flex-1'>\n <View className='flex-row items-center flex-wrap'>\n <Text className='text-sm font-medium text-gray-900 dark:text-gray-100'>\n {entry.actor.name}\n </Text>\n <Text className='text-sm text-gray-600 dark:text-gray-400 mx-1'>\n {entry.action}d\n </Text>\n <Text className='text-sm font-medium text-gray-900 dark:text-gray-100'>\n {entry.resource.name}\n </Text>\n </View>\n <View className='flex-row items-center mt-1'>\n <View\n className={cn(\n 'px-1.5 py-0.5 rounded mr-2',\n config.bgColor,\n config.darkBgColor\n )}\n >\n <Text\n className={cn(\n 'text-xs font-medium uppercase',\n config.color\n )}\n >\n {entry.action}\n </Text>\n </View>\n <Text className='text-xs text-gray-500 dark:text-gray-500'>\n {entry.resource.type}\n </Text>\n </View>\n <View className='flex-row items-center mt-2'>\n <Text className='text-xs text-gray-400 dark:text-gray-600'>\n {formatTimestamp(entry.timestamp)}\n </Text>\n {entry.ipAddress && (\n <Text className='text-xs text-gray-400 dark:text-gray-600 ml-2'>\n IP: {entry.ipAddress}\n </Text>\n )}\n </View>\n </View>\n </View>\n </View>\n );\n\n if (onEntryPress) {\n return (\n <Pressable\n key={entry.id}\n onPress={() => onEntryPress(entry)}\n accessibilityRole='button'\n >\n {content}\n </Pressable>\n );\n }\n\n return <View key={entry.id}>{content}</View>;\n })}\n </ScrollView>\n <View className='px-4 py-2 bg-gray-50 dark:bg-gray-900 border-t border-gray-200 dark:border-gray-700'>\n <Text className='text-xs text-gray-500 dark:text-gray-500'>\n Showing {entries.length} audit entries\n </Text>\n </View>\n </Card>\n );\n};\n\nexport default AuditLog;\n","import React from 'react';\nimport { View, Text, ScrollView, Pressable } from 'react-native';\nimport { cn, Card } from '@sudobility/components-rn';\n\nexport type PipelineStageStatus =\n | 'pending'\n | 'running'\n | 'success'\n | 'failed'\n | 'skipped'\n | 'cancelled';\n\nexport interface PipelineStage {\n id: string;\n name: string;\n status: PipelineStageStatus;\n duration?: number;\n startedAt?: Date;\n finishedAt?: Date;\n jobs?: {\n id: string;\n name: string;\n status: PipelineStageStatus;\n }[];\n}\n\nexport interface PipelineViewProps {\n stages: PipelineStage[];\n pipelineName?: string;\n pipelineId?: string;\n onStagePress?: (stage: PipelineStage) => void;\n className?: string;\n}\n\nconst statusConfig: Record<\n PipelineStageStatus,\n {\n color: string;\n bgColor: string;\n darkBgColor: string;\n borderColor: string;\n icon: string;\n }\n> = {\n pending: {\n color: 'text-gray-600 dark:text-gray-400',\n bgColor: 'bg-gray-100',\n darkBgColor: 'dark:bg-gray-800',\n borderColor: 'border-gray-300 dark:border-gray-600',\n icon: '○',\n },\n running: {\n color: 'text-blue-600 dark:text-blue-400',\n bgColor: 'bg-blue-100',\n darkBgColor: 'dark:bg-blue-900',\n borderColor: 'border-blue-400 dark:border-blue-500',\n icon: '◐',\n },\n success: {\n color: 'text-green-600 dark:text-green-400',\n bgColor: 'bg-green-100',\n darkBgColor: 'dark:bg-green-900',\n borderColor: 'border-green-400 dark:border-green-500',\n icon: '●',\n },\n failed: {\n color: 'text-red-600 dark:text-red-400',\n bgColor: 'bg-red-100',\n darkBgColor: 'dark:bg-red-900',\n borderColor: 'border-red-400 dark:border-red-500',\n icon: '✗',\n },\n skipped: {\n color: 'text-gray-400 dark:text-gray-600',\n bgColor: 'bg-gray-50',\n darkBgColor: 'dark:bg-gray-900',\n borderColor: 'border-gray-200 dark:border-gray-700',\n icon: '◌',\n },\n cancelled: {\n color: 'text-orange-600 dark:text-orange-400',\n bgColor: 'bg-orange-100',\n darkBgColor: 'dark:bg-orange-900',\n borderColor: 'border-orange-400 dark:border-orange-500',\n icon: '⊘',\n },\n};\n\nconst formatDuration = (seconds: number): string => {\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n return `${minutes}m ${remainingSeconds}s`;\n};\n\nexport const PipelineView: React.FC<PipelineViewProps> = ({\n stages,\n pipelineName,\n pipelineId,\n onStagePress,\n className,\n}) => {\n const overallStatus = stages.some(s => s.status === 'failed')\n ? 'failed'\n : stages.some(s => s.status === 'running')\n ? 'running'\n : stages.every(s => s.status === 'success')\n ? 'success'\n : stages.every(s => s.status === 'pending')\n ? 'pending'\n : 'running';\n\n const overallConfig = statusConfig[overallStatus];\n\n return (\n <Card className={cn('overflow-hidden', className)}>\n {(pipelineName || pipelineId) && (\n <View className='px-4 py-3 border-b border-gray-200 dark:border-gray-700'>\n <View className='flex-row items-center justify-between'>\n <View>\n {pipelineName && (\n <Text className='text-base font-semibold text-gray-900 dark:text-gray-100'>\n {pipelineName}\n </Text>\n )}\n {pipelineId && (\n <Text className='text-xs font-mono text-gray-500 dark:text-gray-500'>\n #{pipelineId}\n </Text>\n )}\n </View>\n <View\n className={cn(\n 'px-2 py-1 rounded-full',\n overallConfig.bgColor,\n overallConfig.darkBgColor\n )}\n >\n <Text className={cn('text-xs font-medium', overallConfig.color)}>\n {overallConfig.icon}{' '}\n {overallStatus.charAt(0).toUpperCase() + overallStatus.slice(1)}\n </Text>\n </View>\n </View>\n </View>\n )}\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={true}\n contentContainerStyle={{ padding: 16 }}\n >\n <View className='flex-row items-center'>\n {stages.map((stage, index) => {\n const config = statusConfig[stage.status];\n const isLast = index === stages.length - 1;\n\n const stageContent = (\n <View className='items-center'>\n <View\n className={cn(\n 'w-24 p-3 rounded-lg border-2',\n config.bgColor,\n config.darkBgColor,\n config.borderColor\n )}\n >\n <View className='items-center'>\n <Text className={cn('text-lg', config.color)}>\n {config.icon}\n </Text>\n <Text\n className='text-xs font-medium text-gray-900 dark:text-gray-100 mt-1 text-center'\n numberOfLines={2}\n >\n {stage.name}\n </Text>\n {stage.duration !== undefined && (\n <Text className='text-xs text-gray-500 dark:text-gray-500 mt-1'>\n {formatDuration(stage.duration)}\n </Text>\n )}\n </View>\n </View>\n {stage.jobs && stage.jobs.length > 0 && (\n <View className='mt-2'>\n <Text className='text-xs text-gray-500 dark:text-gray-500'>\n {stage.jobs.filter(j => j.status === 'success').length}/\n {stage.jobs.length} jobs\n </Text>\n </View>\n )}\n </View>\n );\n\n return (\n <View key={stage.id} className='flex-row items-center'>\n {onStagePress ? (\n <Pressable\n onPress={() => onStagePress(stage)}\n accessibilityRole='button'\n accessibilityLabel={`${stage.name} - ${stage.status}`}\n >\n {stageContent}\n </Pressable>\n ) : (\n stageContent\n )}\n {!isLast && (\n <View className='mx-2'>\n <View className='w-8 h-0.5 bg-gray-300 dark:bg-gray-600' />\n <Text className='absolute -top-2 left-2 text-gray-400 dark:text-gray-600'>\n →\n </Text>\n </View>\n )}\n </View>\n );\n })}\n </View>\n </ScrollView>\n <View className='px-4 py-2 bg-gray-50 dark:bg-gray-900 border-t border-gray-200 dark:border-gray-700'>\n <Text className='text-xs text-gray-500 dark:text-gray-500'>\n {stages.length} stages |{' '}\n {stages.filter(s => s.status === 'success').length} completed\n </Text>\n </View>\n </Card>\n );\n};\n\nexport default PipelineView;\n"],"names":["jsxRuntimeModule","require$$0","require$$1","statusConfig","jsxs","jsx","formatDuration"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sudobility/devops-components-rn",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "React Native DevOps components for Sudobility",
|
|
3
|
+
"version": "1.0.2",
|
|
4
|
+
"description": "React Native DevOps and deployment UI components for Sudobility",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.esm.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -21,7 +21,8 @@
|
|
|
21
21
|
"scripts": {
|
|
22
22
|
"build": "tsc && vite build",
|
|
23
23
|
"dev": "vite build --watch",
|
|
24
|
-
"type-check": "tsc --noEmit"
|
|
24
|
+
"type-check": "tsc --noEmit",
|
|
25
|
+
"test": "jest --passWithNoTests"
|
|
25
26
|
},
|
|
26
27
|
"peerDependencies": {
|
|
27
28
|
"@sudobility/components-rn": "^1.0.0",
|
|
@@ -30,12 +31,9 @@
|
|
|
30
31
|
"react-native": ">=0.72.0"
|
|
31
32
|
},
|
|
32
33
|
"devDependencies": {
|
|
33
|
-
"@sudobility/components-rn": "^1.0.
|
|
34
|
+
"@sudobility/components-rn": "^1.0.7",
|
|
34
35
|
"@sudobility/design": "^1.1.14",
|
|
35
36
|
"@types/react": "^18.3.0",
|
|
36
|
-
"@types/react-native": "^0.73.0",
|
|
37
|
-
"react": "^18.3.0",
|
|
38
|
-
"react-native": "^0.76.0",
|
|
39
37
|
"typescript": "^5.6.0",
|
|
40
38
|
"vite": "^6.0.0",
|
|
41
39
|
"vite-plugin-dts": "^4.3.0"
|
|
@@ -48,9 +46,10 @@
|
|
|
48
46
|
"keywords": [
|
|
49
47
|
"react-native",
|
|
50
48
|
"devops",
|
|
51
|
-
"
|
|
52
|
-
"monitoring"
|
|
49
|
+
"deployment",
|
|
50
|
+
"monitoring",
|
|
51
|
+
"components"
|
|
53
52
|
],
|
|
54
53
|
"author": "Sudobility",
|
|
55
|
-
"license": "
|
|
54
|
+
"license": "BUSL-1.1"
|
|
56
55
|
}
|
package/src/AlertDialog.tsx
CHANGED
|
@@ -25,7 +25,10 @@ export interface AlertDialogProps extends ViewProps {
|
|
|
25
25
|
loading?: boolean;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
const variantClasses: Record<
|
|
28
|
+
const variantClasses: Record<
|
|
29
|
+
AlertVariant,
|
|
30
|
+
{ iconBg: string; icon: string; button: string }
|
|
31
|
+
> = {
|
|
29
32
|
default: {
|
|
30
33
|
iconBg: 'bg-blue-100 dark:bg-blue-900/30',
|
|
31
34
|
icon: 'text-blue-600 dark:text-blue-400',
|
|
@@ -86,10 +89,10 @@ export const AlertDialog: React.FC<AlertDialogProps> = ({
|
|
|
86
89
|
<Modal
|
|
87
90
|
visible={isOpen}
|
|
88
91
|
transparent
|
|
89
|
-
animationType=
|
|
92
|
+
animationType='fade'
|
|
90
93
|
onRequestClose={onClose}
|
|
91
94
|
>
|
|
92
|
-
<View className=
|
|
95
|
+
<View className='flex-1 justify-center items-center bg-black/50 p-4'>
|
|
93
96
|
<View
|
|
94
97
|
className={cn(
|
|
95
98
|
'w-full max-w-md bg-white dark:bg-gray-900 rounded-lg shadow-xl',
|
|
@@ -98,8 +101,8 @@ export const AlertDialog: React.FC<AlertDialogProps> = ({
|
|
|
98
101
|
{...props}
|
|
99
102
|
>
|
|
100
103
|
{/* Content */}
|
|
101
|
-
<View className=
|
|
102
|
-
<View className=
|
|
104
|
+
<View className='p-6'>
|
|
105
|
+
<View className='flex-row items-start gap-4'>
|
|
103
106
|
<View
|
|
104
107
|
className={cn(
|
|
105
108
|
'w-12 h-12 rounded-full items-center justify-center',
|
|
@@ -111,14 +114,14 @@ export const AlertDialog: React.FC<AlertDialogProps> = ({
|
|
|
111
114
|
</Text>
|
|
112
115
|
</View>
|
|
113
116
|
|
|
114
|
-
<View className=
|
|
115
|
-
<Text className=
|
|
117
|
+
<View className='flex-1'>
|
|
118
|
+
<Text className='text-lg font-semibold text-gray-900 dark:text-white mb-2'>
|
|
116
119
|
{typeof title === 'string' ? title : null}
|
|
117
120
|
</Text>
|
|
118
121
|
{typeof title !== 'string' && title}
|
|
119
122
|
|
|
120
123
|
{description && (
|
|
121
|
-
<Text className=
|
|
124
|
+
<Text className='text-sm text-gray-600 dark:text-gray-400'>
|
|
122
125
|
{typeof description === 'string' ? description : null}
|
|
123
126
|
</Text>
|
|
124
127
|
)}
|
|
@@ -128,12 +131,12 @@ export const AlertDialog: React.FC<AlertDialogProps> = ({
|
|
|
128
131
|
</View>
|
|
129
132
|
|
|
130
133
|
{/* Actions */}
|
|
131
|
-
<View className=
|
|
134
|
+
<View className='flex-row gap-3 px-6 py-4 bg-gray-50 dark:bg-gray-800/50 rounded-b-lg'>
|
|
132
135
|
{showCancel && (
|
|
133
136
|
<Pressable
|
|
134
137
|
onPress={onClose}
|
|
135
138
|
disabled={loading}
|
|
136
|
-
accessibilityRole=
|
|
139
|
+
accessibilityRole='button'
|
|
137
140
|
className={cn(
|
|
138
141
|
'flex-1 px-4 py-2 rounded-md border',
|
|
139
142
|
'bg-white dark:bg-gray-700',
|
|
@@ -141,7 +144,7 @@ export const AlertDialog: React.FC<AlertDialogProps> = ({
|
|
|
141
144
|
loading && 'opacity-50'
|
|
142
145
|
)}
|
|
143
146
|
>
|
|
144
|
-
<Text className=
|
|
147
|
+
<Text className='text-sm font-medium text-center text-gray-700 dark:text-gray-300'>
|
|
145
148
|
{cancelLabel}
|
|
146
149
|
</Text>
|
|
147
150
|
</Pressable>
|
|
@@ -150,7 +153,7 @@ export const AlertDialog: React.FC<AlertDialogProps> = ({
|
|
|
150
153
|
<Pressable
|
|
151
154
|
onPress={handleConfirm}
|
|
152
155
|
disabled={confirmDisabled || loading}
|
|
153
|
-
accessibilityRole=
|
|
156
|
+
accessibilityRole='button'
|
|
154
157
|
className={cn(
|
|
155
158
|
'flex-1 px-4 py-2 rounded-md',
|
|
156
159
|
styles.button,
|
|
@@ -158,12 +161,14 @@ export const AlertDialog: React.FC<AlertDialogProps> = ({
|
|
|
158
161
|
)}
|
|
159
162
|
>
|
|
160
163
|
{loading ? (
|
|
161
|
-
<View className=
|
|
162
|
-
<ActivityIndicator size=
|
|
163
|
-
<Text className=
|
|
164
|
+
<View className='flex-row items-center justify-center gap-2'>
|
|
165
|
+
<ActivityIndicator size='small' color='white' />
|
|
166
|
+
<Text className='text-sm font-medium text-white'>
|
|
167
|
+
Loading...
|
|
168
|
+
</Text>
|
|
164
169
|
</View>
|
|
165
170
|
) : (
|
|
166
|
-
<Text className=
|
|
171
|
+
<Text className='text-sm font-medium text-center text-white'>
|
|
167
172
|
{confirmLabel}
|
|
168
173
|
</Text>
|
|
169
174
|
)}
|
package/src/ApiPlayground.tsx
CHANGED
|
@@ -18,8 +18,8 @@ export const ApiPlayground: React.FC<ApiPlaygroundProps> = ({
|
|
|
18
18
|
<Pressable
|
|
19
19
|
onPress={disabled ? undefined : onPress}
|
|
20
20
|
disabled={disabled}
|
|
21
|
-
accessibilityRole=
|
|
22
|
-
accessibilityLabel=
|
|
21
|
+
accessibilityRole='button'
|
|
22
|
+
accessibilityLabel='API Playground'
|
|
23
23
|
className={cn(
|
|
24
24
|
'p-4 rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700',
|
|
25
25
|
disabled && 'opacity-50',
|
|
@@ -27,6 +27,10 @@ export const ApiPlayground: React.FC<ApiPlaygroundProps> = ({
|
|
|
27
27
|
)}
|
|
28
28
|
{...props}
|
|
29
29
|
>
|
|
30
|
-
{children ||
|
|
30
|
+
{children || (
|
|
31
|
+
<Text className='text-gray-900 dark:text-white'>
|
|
32
|
+
ApiPlayground Component
|
|
33
|
+
</Text>
|
|
34
|
+
)}
|
|
31
35
|
</Pressable>
|
|
32
36
|
);
|
package/src/ApiReference.tsx
CHANGED
|
@@ -19,9 +19,13 @@ export const ApiReference: React.FC<ApiReferenceProps> = ({
|
|
|
19
19
|
disabled && 'opacity-50',
|
|
20
20
|
className
|
|
21
21
|
)}
|
|
22
|
-
accessibilityLabel=
|
|
22
|
+
accessibilityLabel='API Reference'
|
|
23
23
|
{...props}
|
|
24
24
|
>
|
|
25
|
-
{children ||
|
|
25
|
+
{children || (
|
|
26
|
+
<Text className='text-gray-900 dark:text-white'>
|
|
27
|
+
ApiReference Component
|
|
28
|
+
</Text>
|
|
29
|
+
)}
|
|
26
30
|
</View>
|
|
27
31
|
);
|
package/src/AuditLog.tsx
CHANGED
|
@@ -1,27 +1,250 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { View, Text,
|
|
3
|
-
import { cn } from '@sudobility/components-rn';
|
|
2
|
+
import { View, Text, ScrollView, Pressable } from 'react-native';
|
|
3
|
+
import { cn, Card } from '@sudobility/components-rn';
|
|
4
4
|
|
|
5
|
-
export
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
export type AuditActionType =
|
|
6
|
+
| 'create'
|
|
7
|
+
| 'update'
|
|
8
|
+
| 'delete'
|
|
9
|
+
| 'login'
|
|
10
|
+
| 'logout'
|
|
11
|
+
| 'access'
|
|
12
|
+
| 'export'
|
|
13
|
+
| 'import'
|
|
14
|
+
| 'approve'
|
|
15
|
+
| 'reject'
|
|
16
|
+
| 'deploy'
|
|
17
|
+
| 'rollback';
|
|
18
|
+
|
|
19
|
+
export interface AuditEntry {
|
|
20
|
+
id: string;
|
|
21
|
+
action: AuditActionType;
|
|
22
|
+
actor: {
|
|
23
|
+
id: string;
|
|
24
|
+
name: string;
|
|
25
|
+
email?: string;
|
|
26
|
+
avatar?: string;
|
|
27
|
+
};
|
|
28
|
+
resource: {
|
|
29
|
+
type: string;
|
|
30
|
+
id: string;
|
|
31
|
+
name: string;
|
|
32
|
+
};
|
|
33
|
+
timestamp: Date;
|
|
34
|
+
metadata?: Record<string, unknown>;
|
|
35
|
+
ipAddress?: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface AuditLogProps {
|
|
39
|
+
entries: AuditEntry[];
|
|
40
|
+
title?: string;
|
|
41
|
+
maxHeight?: number;
|
|
42
|
+
onEntryPress?: (entry: AuditEntry) => void;
|
|
43
|
+
className?: string;
|
|
8
44
|
}
|
|
9
45
|
|
|
46
|
+
const actionConfig: Record<
|
|
47
|
+
AuditActionType,
|
|
48
|
+
{ color: string; bgColor: string; darkBgColor: string; icon: string }
|
|
49
|
+
> = {
|
|
50
|
+
create: {
|
|
51
|
+
color: 'text-green-700 dark:text-green-300',
|
|
52
|
+
bgColor: 'bg-green-100',
|
|
53
|
+
darkBgColor: 'dark:bg-green-900',
|
|
54
|
+
icon: '+',
|
|
55
|
+
},
|
|
56
|
+
update: {
|
|
57
|
+
color: 'text-blue-700 dark:text-blue-300',
|
|
58
|
+
bgColor: 'bg-blue-100',
|
|
59
|
+
darkBgColor: 'dark:bg-blue-900',
|
|
60
|
+
icon: '~',
|
|
61
|
+
},
|
|
62
|
+
delete: {
|
|
63
|
+
color: 'text-red-700 dark:text-red-300',
|
|
64
|
+
bgColor: 'bg-red-100',
|
|
65
|
+
darkBgColor: 'dark:bg-red-900',
|
|
66
|
+
icon: '-',
|
|
67
|
+
},
|
|
68
|
+
login: {
|
|
69
|
+
color: 'text-purple-700 dark:text-purple-300',
|
|
70
|
+
bgColor: 'bg-purple-100',
|
|
71
|
+
darkBgColor: 'dark:bg-purple-900',
|
|
72
|
+
icon: '→',
|
|
73
|
+
},
|
|
74
|
+
logout: {
|
|
75
|
+
color: 'text-gray-700 dark:text-gray-300',
|
|
76
|
+
bgColor: 'bg-gray-100',
|
|
77
|
+
darkBgColor: 'dark:bg-gray-800',
|
|
78
|
+
icon: '←',
|
|
79
|
+
},
|
|
80
|
+
access: {
|
|
81
|
+
color: 'text-cyan-700 dark:text-cyan-300',
|
|
82
|
+
bgColor: 'bg-cyan-100',
|
|
83
|
+
darkBgColor: 'dark:bg-cyan-900',
|
|
84
|
+
icon: '◉',
|
|
85
|
+
},
|
|
86
|
+
export: {
|
|
87
|
+
color: 'text-orange-700 dark:text-orange-300',
|
|
88
|
+
bgColor: 'bg-orange-100',
|
|
89
|
+
darkBgColor: 'dark:bg-orange-900',
|
|
90
|
+
icon: '↑',
|
|
91
|
+
},
|
|
92
|
+
import: {
|
|
93
|
+
color: 'text-teal-700 dark:text-teal-300',
|
|
94
|
+
bgColor: 'bg-teal-100',
|
|
95
|
+
darkBgColor: 'dark:bg-teal-900',
|
|
96
|
+
icon: '↓',
|
|
97
|
+
},
|
|
98
|
+
approve: {
|
|
99
|
+
color: 'text-emerald-700 dark:text-emerald-300',
|
|
100
|
+
bgColor: 'bg-emerald-100',
|
|
101
|
+
darkBgColor: 'dark:bg-emerald-900',
|
|
102
|
+
icon: '✓',
|
|
103
|
+
},
|
|
104
|
+
reject: {
|
|
105
|
+
color: 'text-rose-700 dark:text-rose-300',
|
|
106
|
+
bgColor: 'bg-rose-100',
|
|
107
|
+
darkBgColor: 'dark:bg-rose-900',
|
|
108
|
+
icon: '✗',
|
|
109
|
+
},
|
|
110
|
+
deploy: {
|
|
111
|
+
color: 'text-indigo-700 dark:text-indigo-300',
|
|
112
|
+
bgColor: 'bg-indigo-100',
|
|
113
|
+
darkBgColor: 'dark:bg-indigo-900',
|
|
114
|
+
icon: '▲',
|
|
115
|
+
},
|
|
116
|
+
rollback: {
|
|
117
|
+
color: 'text-amber-700 dark:text-amber-300',
|
|
118
|
+
bgColor: 'bg-amber-100',
|
|
119
|
+
darkBgColor: 'dark:bg-amber-900',
|
|
120
|
+
icon: '↺',
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
const formatTimestamp = (date: Date): string => {
|
|
125
|
+
const now = new Date();
|
|
126
|
+
const diffMs = now.getTime() - date.getTime();
|
|
127
|
+
const diffMins = Math.floor(diffMs / 60000);
|
|
128
|
+
const diffHours = Math.floor(diffMs / 3600000);
|
|
129
|
+
const diffDays = Math.floor(diffMs / 86400000);
|
|
130
|
+
|
|
131
|
+
if (diffMins < 1) return 'Just now';
|
|
132
|
+
if (diffMins < 60) return `${diffMins}m ago`;
|
|
133
|
+
if (diffHours < 24) return `${diffHours}h ago`;
|
|
134
|
+
if (diffDays < 7) return `${diffDays}d ago`;
|
|
135
|
+
return date.toLocaleDateString();
|
|
136
|
+
};
|
|
137
|
+
|
|
10
138
|
export const AuditLog: React.FC<AuditLogProps> = ({
|
|
139
|
+
entries,
|
|
140
|
+
title,
|
|
141
|
+
maxHeight = 500,
|
|
142
|
+
onEntryPress,
|
|
11
143
|
className,
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
144
|
+
}) => {
|
|
145
|
+
return (
|
|
146
|
+
<Card className={cn('overflow-hidden', className)}>
|
|
147
|
+
{title && (
|
|
148
|
+
<View className='px-4 py-3 border-b border-gray-200 dark:border-gray-700'>
|
|
149
|
+
<Text className='text-base font-semibold text-gray-900 dark:text-gray-100'>
|
|
150
|
+
{title}
|
|
151
|
+
</Text>
|
|
152
|
+
</View>
|
|
153
|
+
)}
|
|
154
|
+
<ScrollView style={{ maxHeight }} showsVerticalScrollIndicator={true}>
|
|
155
|
+
{entries.map((entry, index) => {
|
|
156
|
+
const config = actionConfig[entry.action];
|
|
157
|
+
const isLast = index === entries.length - 1;
|
|
158
|
+
|
|
159
|
+
const content = (
|
|
160
|
+
<View
|
|
161
|
+
className={cn(
|
|
162
|
+
'px-4 py-3',
|
|
163
|
+
!isLast && 'border-b border-gray-100 dark:border-gray-800'
|
|
164
|
+
)}
|
|
165
|
+
>
|
|
166
|
+
<View className='flex-row items-start'>
|
|
167
|
+
<View
|
|
168
|
+
className={cn(
|
|
169
|
+
'w-8 h-8 rounded-full items-center justify-center mr-3',
|
|
170
|
+
config.bgColor,
|
|
171
|
+
config.darkBgColor
|
|
172
|
+
)}
|
|
173
|
+
>
|
|
174
|
+
<Text className={cn('text-sm font-bold', config.color)}>
|
|
175
|
+
{config.icon}
|
|
176
|
+
</Text>
|
|
177
|
+
</View>
|
|
178
|
+
<View className='flex-1'>
|
|
179
|
+
<View className='flex-row items-center flex-wrap'>
|
|
180
|
+
<Text className='text-sm font-medium text-gray-900 dark:text-gray-100'>
|
|
181
|
+
{entry.actor.name}
|
|
182
|
+
</Text>
|
|
183
|
+
<Text className='text-sm text-gray-600 dark:text-gray-400 mx-1'>
|
|
184
|
+
{entry.action}d
|
|
185
|
+
</Text>
|
|
186
|
+
<Text className='text-sm font-medium text-gray-900 dark:text-gray-100'>
|
|
187
|
+
{entry.resource.name}
|
|
188
|
+
</Text>
|
|
189
|
+
</View>
|
|
190
|
+
<View className='flex-row items-center mt-1'>
|
|
191
|
+
<View
|
|
192
|
+
className={cn(
|
|
193
|
+
'px-1.5 py-0.5 rounded mr-2',
|
|
194
|
+
config.bgColor,
|
|
195
|
+
config.darkBgColor
|
|
196
|
+
)}
|
|
197
|
+
>
|
|
198
|
+
<Text
|
|
199
|
+
className={cn(
|
|
200
|
+
'text-xs font-medium uppercase',
|
|
201
|
+
config.color
|
|
202
|
+
)}
|
|
203
|
+
>
|
|
204
|
+
{entry.action}
|
|
205
|
+
</Text>
|
|
206
|
+
</View>
|
|
207
|
+
<Text className='text-xs text-gray-500 dark:text-gray-500'>
|
|
208
|
+
{entry.resource.type}
|
|
209
|
+
</Text>
|
|
210
|
+
</View>
|
|
211
|
+
<View className='flex-row items-center mt-2'>
|
|
212
|
+
<Text className='text-xs text-gray-400 dark:text-gray-600'>
|
|
213
|
+
{formatTimestamp(entry.timestamp)}
|
|
214
|
+
</Text>
|
|
215
|
+
{entry.ipAddress && (
|
|
216
|
+
<Text className='text-xs text-gray-400 dark:text-gray-600 ml-2'>
|
|
217
|
+
IP: {entry.ipAddress}
|
|
218
|
+
</Text>
|
|
219
|
+
)}
|
|
220
|
+
</View>
|
|
221
|
+
</View>
|
|
222
|
+
</View>
|
|
223
|
+
</View>
|
|
224
|
+
);
|
|
225
|
+
|
|
226
|
+
if (onEntryPress) {
|
|
227
|
+
return (
|
|
228
|
+
<Pressable
|
|
229
|
+
key={entry.id}
|
|
230
|
+
onPress={() => onEntryPress(entry)}
|
|
231
|
+
accessibilityRole='button'
|
|
232
|
+
>
|
|
233
|
+
{content}
|
|
234
|
+
</Pressable>
|
|
235
|
+
);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
return <View key={entry.id}>{content}</View>;
|
|
239
|
+
})}
|
|
240
|
+
</ScrollView>
|
|
241
|
+
<View className='px-4 py-2 bg-gray-50 dark:bg-gray-900 border-t border-gray-200 dark:border-gray-700'>
|
|
242
|
+
<Text className='text-xs text-gray-500 dark:text-gray-500'>
|
|
243
|
+
Showing {entries.length} audit entries
|
|
244
|
+
</Text>
|
|
245
|
+
</View>
|
|
246
|
+
</Card>
|
|
247
|
+
);
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
export default AuditLog;
|
package/src/BodyMetrics.tsx
CHANGED
|
@@ -19,9 +19,13 @@ export const BodyMetrics: React.FC<BodyMetricsProps> = ({
|
|
|
19
19
|
disabled && 'opacity-50',
|
|
20
20
|
className
|
|
21
21
|
)}
|
|
22
|
-
accessibilityLabel=
|
|
22
|
+
accessibilityLabel='Body Metrics'
|
|
23
23
|
{...props}
|
|
24
24
|
>
|
|
25
|
-
{children ||
|
|
25
|
+
{children || (
|
|
26
|
+
<Text className='text-gray-900 dark:text-white'>
|
|
27
|
+
BodyMetrics Component
|
|
28
|
+
</Text>
|
|
29
|
+
)}
|
|
26
30
|
</View>
|
|
27
31
|
);
|