Add Pezkuwi SDK UI - Polkadot.js Apps clone

- Clone Polkadot.js Apps repository
- Update package.json with Pezkuwi branding
- Add Pezkuwi endpoint to production chains (wss://pezkuwichain.app:9944)
- Create comprehensive README for SDK UI
- Set up project structure with all packages

Next steps:
- Apply Kurdistan colors (Kesk, Sor, Zer, Spi + Black) to UI theme
- Replace logos with Pezkuwi branding
- Test build and deployment
This commit is contained in:
Claude
2025-11-14 00:55:17 +00:00
parent 24be8d4411
commit 60a800b33e
5836 changed files with 324981 additions and 17 deletions
@@ -0,0 +1,75 @@
// Copyright 2017-2025 @polkadot/app-extrinsics authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { ApiPromise } from '@polkadot/api';
import type { SubmittableExtrinsic, SubmittableExtrinsicFunction } from '@polkadot/api/types';
import type { Call } from '@polkadot/types/interfaces';
import type { Props, RawParam } from '../types.js';
import React, { useState } from 'react';
import { useApi } from '@polkadot/react-hooks';
import { isObject, isString } from '@polkadot/util';
import Extrinsic from './Extrinsic.js';
function isCall (f: unknown): f is Call {
return isString((f as Call).section) && isString((f as Call).method);
}
function isSubmittable (f: unknown): f is SubmittableExtrinsic<'promise'> {
return isObject((f as SubmittableExtrinsic<'promise'>).method) && isString((f as SubmittableExtrinsic<'promise'>).method.section) && isString((f as SubmittableExtrinsic<'promise'>).method.method);
}
function mapArgs (args: unknown[]): RawParam[] {
return args.map((value) => ({
isValid: true,
value
}));
}
export function extractInitial (api: ApiPromise, initialValue: SubmittableExtrinsicFunction<'promise'>, input?: RawParam): { initialArgs?: RawParam[], initialValue: SubmittableExtrinsicFunction<'promise'> } {
try {
return input?.value
? isCall(input.value)
? {
initialArgs: mapArgs(input.value.args),
initialValue: api.tx[input.value.section][input.value.method]
}
: isSubmittable(input.value)
? {
initialArgs: mapArgs(input.value.method.args),
initialValue: api.tx[input.value.method.section][input.value.method.method]
}
: { initialValue: (input.value as SubmittableExtrinsicFunction<'promise'>) }
: { initialValue };
} catch {
return { initialValue };
}
}
function CallDisplay ({ className = '', defaultValue, isDisabled, isError, label, onChange, onEnter, onEscape, withLabel }: Props): React.ReactElement<Props> {
const { api, apiDefaultTx } = useApi();
const [{ initialArgs, initialValue }] = useState(
() => extractInitial(api, apiDefaultTx, defaultValue)
);
return (
<Extrinsic
className={className}
defaultArgs={initialArgs}
defaultValue={initialValue}
isDisabled={isDisabled}
isError={isError}
isPrivate={false}
label={label}
onChange={onChange}
onEnter={onEnter}
onEscape={onEscape}
withLabel={withLabel}
/>
);
}
export default React.memo(CallDisplay);
@@ -0,0 +1,52 @@
// Copyright 2017-2025 @polkadot/app-extrinsics authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { SubmittableExtrinsic, SubmittableExtrinsicFunction } from '@polkadot/api/types';
import type { RawParam, RawParamOnChange, RawParamOnEnter, RawParamOnEscape } from '../types.js';
import React, { useCallback } from 'react';
import { Extrinsic as BaseExtrinsic } from '../Named/index.js';
interface Props {
className?: string;
defaultArgs?: RawParam[];
defaultValue: SubmittableExtrinsicFunction<'promise'>;
isDisabled?: boolean;
isError?: boolean;
isPrivate: boolean;
label: React.ReactNode;
onChange?: RawParamOnChange;
onEnter?: RawParamOnEnter;
onEscape?: RawParamOnEscape;
withLabel?: boolean;
}
function ExtrinsicDisplay ({ className = '', defaultArgs, defaultValue, isDisabled, isError, isPrivate, label, onChange, onEnter, onEscape, withLabel }: Props): React.ReactElement<Props> {
const _onChange = useCallback(
(value?: SubmittableExtrinsic<'promise'>) =>
onChange && onChange({
isValid: !!value,
value
}),
[onChange]
);
return (
<BaseExtrinsic
className={className}
defaultArgs={defaultArgs}
defaultValue={defaultValue}
isDisabled={isDisabled}
isError={isError}
isPrivate={isPrivate}
label={label}
onChange={_onChange}
onEnter={onEnter}
onEscape={onEscape}
withLabel={withLabel}
/>
);
}
export default React.memo(ExtrinsicDisplay);
@@ -0,0 +1,54 @@
// Copyright 2017-2025 @polkadot/app-extrinsics authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { SubmittableExtrinsic } from '@polkadot/api/types';
import type { Props, RawParam } from '../types.js';
import React, { useCallback, useState } from 'react';
import { useApi } from '@polkadot/react-hooks';
import { extractInitial } from './Call.js';
import ExtrinsicDisplay from './Extrinsic.js';
function OpaqueCall ({ className = '', defaultValue, isDisabled, isError, label, onChange, onEnter, onEscape, withLabel }: Props): React.ReactElement<Props> {
const { api, apiDefaultTxSudo } = useApi();
const [{ initialArgs, initialValue }] = useState(
() => extractInitial(api, apiDefaultTxSudo, defaultValue)
);
const _onChange = useCallback(
({ isValid, value }: RawParam): void => {
let callData = null;
if (isValid && value) {
callData = (value as SubmittableExtrinsic<'promise'>).method.toHex();
}
onChange && onChange({
isValid,
value: callData
});
},
[onChange]
);
return (
<ExtrinsicDisplay
className={className}
defaultArgs={initialArgs}
defaultValue={initialValue}
isDisabled={isDisabled}
isError={isError}
isPrivate
label={label}
onChange={_onChange}
onEnter={onEnter}
onEscape={onEscape}
withLabel={withLabel}
/>
);
}
export default React.memo(OpaqueCall);
@@ -0,0 +1,53 @@
// Copyright 2017-2025 @polkadot/app-extrinsics authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { Props, RawParam } from '../types.js';
import React, { useCallback, useState } from 'react';
import { useApi } from '@polkadot/react-hooks';
import { extractInitial } from './Call.js';
import ExtrinsicDisplay from './Extrinsic.js';
function ProposalDisplay ({ className = '', defaultValue, isDisabled, isError, label, onChange, onEnter, onEscape, withLabel }: Props): React.ReactElement<Props> {
const { api, apiDefaultTxSudo } = useApi();
const [{ initialArgs, initialValue }] = useState(
() => extractInitial(api, apiDefaultTxSudo, defaultValue)
);
const _onChange = useCallback(
({ isValid, value }: RawParam): void => {
let proposal = null;
if (isValid && value) {
proposal = api.createType('Proposal', value);
}
onChange && onChange({
isValid,
value: proposal
});
},
[api, onChange]
);
return (
<ExtrinsicDisplay
className={className}
defaultArgs={initialArgs}
defaultValue={initialValue}
isDisabled={isDisabled}
isError={isError}
isPrivate
label={label}
onChange={_onChange}
onEnter={onEnter}
onEscape={onEscape}
withLabel={withLabel}
/>
);
}
export default React.memo(ProposalDisplay);
@@ -0,0 +1,17 @@
// Copyright 2017-2025 @polkadot/app-extrinsics authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { ComponentMap } from '../types.js';
import Call from './Call.js';
import OpaqueCall from './OpaqueCall.js';
import Proposal from './Proposal.js';
const components: ComponentMap = {
Call,
OpaqueCall,
Proposal,
RuntimeCall: Call
};
export default components;