@makroz/mobile 1.1.2 → 1.2.1
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/__mocks__/flash-list.d.ts +12 -0
- package/dist/__mocks__/react-native.d.ts +77 -0
- package/dist/auth/MkAuthContext.d.ts +72 -0
- package/dist/auth/MkAuthForm.d.ts +31 -0
- package/dist/auth/MkAuthProvider.d.ts +57 -0
- package/dist/auth/authExports.test.d.ts +2 -0
- package/dist/auth/authExports.test.d.ts.map +1 -0
- package/dist/auth/authExports.test.js +14 -0
- package/dist/auth/authExports.test.js.map +1 -0
- package/dist/auth/secureStorage.d.ts +63 -0
- package/dist/auth/types.d.ts +65 -0
- package/dist/auth/useMkAuth.d.ts +17 -0
- package/dist/components/MkAccordion.d.ts +19 -0
- package/dist/components/MkAccordion.test.d.ts +2 -0
- package/dist/components/MkAlert.d.ts +18 -0
- package/dist/components/MkAlert.test.d.ts +2 -0
- package/dist/components/MkAvatar.d.ts +12 -0
- package/dist/components/MkAvatar.test.d.ts +2 -0
- package/dist/components/MkBadge.d.ts +11 -0
- package/dist/components/MkBadge.test.d.ts +2 -0
- package/dist/components/MkButton.d.ts +13 -0
- package/dist/components/MkButton.test.d.ts +2 -0
- package/dist/components/MkCard.d.ts +15 -0
- package/dist/components/MkCard.test.d.ts +2 -0
- package/dist/components/MkCheck.d.ts +18 -0
- package/dist/components/MkCheck.test.d.ts +2 -0
- package/dist/components/MkDatePicker.d.ts +30 -0
- package/dist/components/MkDatePicker.test.d.ts +2 -0
- package/dist/components/MkDivider.d.ts +11 -0
- package/dist/components/MkDivider.test.d.ts +2 -0
- package/dist/components/MkDropDown.d.ts +37 -0
- package/dist/components/MkDropDown.test.d.ts +2 -0
- package/dist/components/MkEmptyState.d.ts +11 -0
- package/dist/components/MkEmptyState.test.d.ts +2 -0
- package/dist/components/MkFileUpload.d.ts +63 -0
- package/dist/components/MkFileUpload.test.d.ts +2 -0
- package/dist/components/MkIcons.d.ts +15 -0
- package/dist/components/MkInfiniteList.d.ts +22 -0
- package/dist/components/MkInfiniteList.d.ts.map +1 -1
- package/dist/components/MkInfiniteList.js +7 -7
- package/dist/components/MkInfiniteList.js.map +1 -1
- package/dist/components/MkInfiniteList.test.d.ts +2 -0
- package/dist/components/MkInput.d.ts +16 -0
- package/dist/components/MkInput.test.d.ts +2 -0
- package/dist/components/MkLoading.d.ts +12 -0
- package/dist/components/MkLoading.test.d.ts +2 -0
- package/dist/components/MkModal.d.ts +20 -0
- package/dist/components/MkModal.test.d.ts +2 -0
- package/dist/components/MkProgressBar.d.ts +13 -0
- package/dist/components/MkProgressBar.test.d.ts +2 -0
- package/dist/components/MkRadio.d.ts +20 -0
- package/dist/components/MkRadio.test.d.ts +2 -0
- package/dist/components/MkSearchInput.d.ts +21 -0
- package/dist/components/MkSearchInput.test.d.ts +2 -0
- package/dist/components/MkSelect.d.ts +16 -0
- package/dist/components/MkSelect.test.d.ts +2 -0
- package/dist/components/MkSkeleton.d.ts +13 -0
- package/dist/components/MkSkeleton.d.ts.map +1 -1
- package/dist/components/MkSkeleton.js +10 -7
- package/dist/components/MkSkeleton.js.map +1 -1
- package/dist/components/MkSkeleton.test.d.ts +2 -0
- package/dist/components/MkSwitch.d.ts +13 -0
- package/dist/components/MkSwitch.test.d.ts +2 -0
- package/dist/components/MkTable.d.ts +39 -0
- package/dist/components/MkTable.test.d.ts +2 -0
- package/dist/components/MkTabs.d.ts +19 -0
- package/dist/components/MkTabs.test.d.ts +2 -0
- package/dist/components/MkTextArea.d.ts +17 -0
- package/dist/components/MkTextArea.test.d.ts +2 -0
- package/dist/components/MkToastRenderer.d.ts +3 -0
- package/dist/components/MkToastRenderer.d.ts.map +1 -1
- package/dist/components/MkToastRenderer.js +9 -7
- package/dist/components/MkToastRenderer.js.map +1 -1
- package/dist/components/MkToastRenderer.test.d.ts +2 -0
- package/dist/components/MkTooltip.d.ts +15 -0
- package/dist/components/MkTooltip.test.d.ts +2 -0
- package/dist/components/MkWindowList.d.ts +48 -0
- package/dist/components/MkWindowList.test.d.ts +2 -0
- package/dist/components/index.d.ts +30 -0
- package/dist/context/MkApiContext.d.ts +14 -0
- package/dist/context/MkAuthContext.d.ts +34 -0
- package/dist/context/MkAuthContext.d.ts.map +1 -1
- package/dist/context/MkAuthContext.js +10 -0
- package/dist/context/MkAuthContext.js.map +1 -1
- package/dist/context/MkConfirmContext.d.ts +8 -0
- package/dist/context/MkToastContext.d.ts +19 -0
- package/dist/hooks/filePicker.types.d.ts +13 -0
- package/dist/hooks/useApi.d.ts +19 -0
- package/dist/hooks/useApi.d.ts.map +1 -1
- package/dist/hooks/useApi.js +7 -6
- package/dist/hooks/useApi.js.map +1 -1
- package/dist/hooks/useApi.test.d.ts +2 -0
- package/dist/hooks/useApi.test.js +38 -3
- package/dist/hooks/useApi.test.js.map +1 -1
- package/dist/hooks/useMkCrud.d.ts +39 -0
- package/dist/hooks/useMkDebounce.d.ts +24 -0
- package/dist/hooks/useMkEffectDebug.d.ts +6 -0
- package/dist/hooks/useMkEvent.d.ts +42 -0
- package/dist/hooks/useMkFilePickerCli.d.ts +59 -0
- package/dist/hooks/useMkFilePickerExpo.d.ts +38 -0
- package/dist/hooks/useMkForm.d.ts +43 -0
- package/dist/hooks/useMkInfiniteList.d.ts +16 -0
- package/dist/hooks/useMkInfiniteList.d.ts.map +1 -1
- package/dist/hooks/useMkInfiniteList.js +14 -3
- package/dist/hooks/useMkInfiniteList.js.map +1 -1
- package/dist/hooks/useMkInfiniteList.test.d.ts +2 -0
- package/dist/hooks/useMkInfiniteList.test.d.ts.map +1 -0
- package/dist/hooks/useMkInfiniteList.test.js +8 -0
- package/dist/hooks/useMkInfiniteList.test.js.map +1 -0
- package/dist/hooks/useMkList.d.ts +79 -0
- package/dist/hooks/useMkList.d.ts.map +1 -1
- package/dist/hooks/useMkList.js.map +1 -1
- package/dist/hooks/useMkLocalStorage.d.ts +6 -0
- package/dist/hooks/useMkPrevious.d.ts +6 -0
- package/dist/hooks/useMkToggle.d.ts +6 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/test-setup.d.ts +28 -0
- package/dist/test-utils.d.ts +22 -0
- package/dist/theme/MkThemeProvider.d.ts +14 -0
- package/dist/theme/MkThemeProvider.d.ts.map +1 -1
- package/dist/theme/MkThemeProvider.js +3 -6
- package/dist/theme/MkThemeProvider.js.map +1 -1
- package/dist/theme/MkThemeProvider.test.d.ts +2 -0
- package/dist/theme/MkThemeProvider.test.d.ts.map +1 -0
- package/dist/theme/MkThemeProvider.test.js +32 -0
- package/dist/theme/MkThemeProvider.test.js.map +1 -0
- package/package.json +16 -16
- package/LICENSE +0 -33
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { MkFormFields, MkFormReturn, MkCrudAction } from '@makroz/core';
|
|
2
|
+
/**
|
|
3
|
+
* @module useMkForm
|
|
4
|
+
* @description Unified form state manager with built-in validation.
|
|
5
|
+
* Works on both Web and Mobile — zero platform dependencies.
|
|
6
|
+
*
|
|
7
|
+
* Uses mkValidation from mk-core for field-level and form-level validation,
|
|
8
|
+
* and mkValidation.getApiFields for extracting API-ready data.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```tsx
|
|
12
|
+
* const form = useMkForm({
|
|
13
|
+
* fields: {
|
|
14
|
+
* name: { rules: ['required', 'min:3'], api: 'ae' },
|
|
15
|
+
* email: { rules: ['required', 'email'], api: 'ae' },
|
|
16
|
+
* phone: { rules: ['phone'], api: 'ae*' },
|
|
17
|
+
* },
|
|
18
|
+
* initialData: { name: '', email: '', phone: '' },
|
|
19
|
+
* });
|
|
20
|
+
*
|
|
21
|
+
* // In handler
|
|
22
|
+
* <MkInput label="Nombre" value={form.formState.name} error={form.errors.name}
|
|
23
|
+
* onChange={v => form.setField('name', v)} />
|
|
24
|
+
*
|
|
25
|
+
* const handleSave = () => {
|
|
26
|
+
* if (!form.validate()) return;
|
|
27
|
+
* const data = form.getApiData();
|
|
28
|
+
* api.post('/users', data);
|
|
29
|
+
* };
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export interface UseMkFormOptions<T = Record<string, any>> {
|
|
33
|
+
/** Field definitions with rules and API flags. */
|
|
34
|
+
fields: MkFormFields;
|
|
35
|
+
/** Initial data for the form. */
|
|
36
|
+
initialData?: Partial<T>;
|
|
37
|
+
/** Current CRUD action (affects which rules apply). Default 'add'. */
|
|
38
|
+
action?: MkCrudAction;
|
|
39
|
+
/** Validate on every setField call. Default false. */
|
|
40
|
+
validateOnChange?: boolean;
|
|
41
|
+
}
|
|
42
|
+
export declare function useMkForm<T extends Record<string, any> = Record<string, any>>({ fields, initialData, action, validateOnChange, }: UseMkFormOptions<T>): MkFormReturn<T>;
|
|
43
|
+
//# sourceMappingURL=useMkForm.d.ts.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface InfiniteListOptions {
|
|
2
|
+
per_page?: number;
|
|
3
|
+
q?: string;
|
|
4
|
+
filter?: Record<string, any>;
|
|
5
|
+
sort?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function useMkInfiniteList(endpoint: string, options?: InfiniteListOptions): {
|
|
8
|
+
items: any[];
|
|
9
|
+
loading: boolean;
|
|
10
|
+
error: unknown;
|
|
11
|
+
isRefreshing: boolean;
|
|
12
|
+
hasMore: boolean;
|
|
13
|
+
loadMore: (isInitial?: boolean) => Promise<void>;
|
|
14
|
+
onRefresh: () => Promise<void>;
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=useMkInfiniteList.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMkInfiniteList.d.ts","sourceRoot":"","sources":["../../src/hooks/useMkInfiniteList.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,mBAAmB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB;;;;;;;;
|
|
1
|
+
{"version":3,"file":"useMkInfiniteList.d.ts","sourceRoot":"","sources":["../../src/hooks/useMkInfiniteList.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,mBAAmB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB;;;;;;;;EAyEpF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useState, useCallback } from 'react';
|
|
1
|
+
import { useState, useCallback, useEffect, useRef } from 'react';
|
|
2
2
|
import { useApi } from './useApi';
|
|
3
3
|
export function useMkInfiniteList(endpoint, options = {}) {
|
|
4
4
|
const api = useApi();
|
|
@@ -6,14 +6,25 @@ export function useMkInfiniteList(endpoint, options = {}) {
|
|
|
6
6
|
const [hasMore, setHasMore] = useState(true);
|
|
7
7
|
const [page, setPage] = useState(1);
|
|
8
8
|
const [isRefreshing, setIsRefreshing] = useState(false);
|
|
9
|
+
// Stable serialization of filter to avoid reference-based re-renders
|
|
10
|
+
const filterString = options.filter ? JSON.stringify(options.filter) : '';
|
|
11
|
+
const optionsRef = useRef(options);
|
|
12
|
+
optionsRef.current = options;
|
|
13
|
+
// Reset list when filters/search changes (consistent with web package)
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
setItems([]);
|
|
16
|
+
setPage(1);
|
|
17
|
+
setHasMore(true);
|
|
18
|
+
}, [options.q, filterString, options.sort]);
|
|
9
19
|
const loadMore = useCallback(async (isInitial = false) => {
|
|
10
20
|
if (!hasMore && !isInitial)
|
|
11
21
|
return;
|
|
12
22
|
if (api.loading && !isInitial)
|
|
13
23
|
return;
|
|
14
24
|
const currentPage = isInitial ? 1 : page;
|
|
25
|
+
const opts = optionsRef.current;
|
|
15
26
|
try {
|
|
16
|
-
const response = await api.get(endpoint, Object.assign(Object.assign({},
|
|
27
|
+
const response = await api.get(endpoint, Object.assign(Object.assign({}, opts), { page: currentPage, per_page: opts.per_page || 15 }));
|
|
17
28
|
if (response.success) {
|
|
18
29
|
const newData = Array.isArray(response.data) ? response.data : [];
|
|
19
30
|
if (isInitial) {
|
|
@@ -39,7 +50,7 @@ export function useMkInfiniteList(endpoint, options = {}) {
|
|
|
39
50
|
catch (e) {
|
|
40
51
|
console.error("MK-Mobile: Infinite List Error", e);
|
|
41
52
|
}
|
|
42
|
-
}, [endpoint, page, hasMore, api.loading
|
|
53
|
+
}, [endpoint, page, hasMore, api.loading]);
|
|
43
54
|
const onRefresh = useCallback(async () => {
|
|
44
55
|
setIsRefreshing(true);
|
|
45
56
|
await loadMore(true);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMkInfiniteList.js","sourceRoot":"","sources":["../../src/hooks/useMkInfiniteList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"useMkInfiniteList.js","sourceRoot":"","sources":["../../src/hooks/useMkInfiniteList.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMkInfiniteList.test.d.ts","sourceRoot":"","sources":["../../src/hooks/useMkInfiniteList.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
describe('useMkInfiniteList (dependency stability)', () => {
|
|
3
|
+
it('should mount without calling API on empty filter change', () => {
|
|
4
|
+
// Test básico de montaje
|
|
5
|
+
expect(true).toBe(true); // placeholder — el hook se prueba vía integración
|
|
6
|
+
});
|
|
7
|
+
});
|
|
8
|
+
//# sourceMappingURL=useMkInfiniteList.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMkInfiniteList.test.js","sourceRoot":"","sources":["../../src/hooks/useMkInfiniteList.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,QAAQ,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACtD,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QAC/D,yBAAyB;QACzB,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,kDAAkD;IAC/E,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module useMkList
|
|
3
|
+
* @description Paginated list manager for React Native — mirrors mk-web's useMkList API.
|
|
4
|
+
* Manages page, search, sort, and filters with auto-refresh on param changes.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```tsx
|
|
8
|
+
* const { data, loading, params, setSearch, setPage, setSort, setFilter, refresh } = useMkList('/users');
|
|
9
|
+
*
|
|
10
|
+
* // Search
|
|
11
|
+
* setSearch('mario');
|
|
12
|
+
*
|
|
13
|
+
* // Change page
|
|
14
|
+
* setPage(2);
|
|
15
|
+
*
|
|
16
|
+
* // Sort
|
|
17
|
+
* setSort('-created_at');
|
|
18
|
+
*
|
|
19
|
+
* // Filter
|
|
20
|
+
* setFilter('status', 'active');
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export interface MkListParams {
|
|
24
|
+
page?: number;
|
|
25
|
+
per_page?: number;
|
|
26
|
+
q?: string;
|
|
27
|
+
sort?: string;
|
|
28
|
+
filter?: Record<string, unknown>;
|
|
29
|
+
}
|
|
30
|
+
/** Shape of the server response for paginated lists. */
|
|
31
|
+
export interface MkListResponse<T = unknown> {
|
|
32
|
+
data: T[];
|
|
33
|
+
__extraData?: {
|
|
34
|
+
current_page?: number;
|
|
35
|
+
last_page?: number;
|
|
36
|
+
per_page?: number;
|
|
37
|
+
total?: number;
|
|
38
|
+
[key: string]: unknown;
|
|
39
|
+
};
|
|
40
|
+
[key: string]: unknown;
|
|
41
|
+
}
|
|
42
|
+
export interface MkListOptions {
|
|
43
|
+
/** Initial params. */
|
|
44
|
+
initialParams?: MkListParams;
|
|
45
|
+
/** Whether to auto-fetch on mount and param changes. Default true. */
|
|
46
|
+
autoFetch?: boolean;
|
|
47
|
+
/** Debounce delay in ms for search updates. Default 0 (no debounce). */
|
|
48
|
+
debounceMs?: number;
|
|
49
|
+
}
|
|
50
|
+
export declare function useMkList(endpoint: string, options?: MkListOptions): {
|
|
51
|
+
params: MkListParams;
|
|
52
|
+
setParams: import("react").Dispatch<import("react").SetStateAction<MkListParams>>;
|
|
53
|
+
setFilter: (field: string, value: any) => void;
|
|
54
|
+
setPage: (page: number) => void;
|
|
55
|
+
setSearch: (q: string) => void;
|
|
56
|
+
setSort: (sort: string) => void;
|
|
57
|
+
setPerPage: (per_page: number) => void;
|
|
58
|
+
resetFilters: () => void;
|
|
59
|
+
refresh: (extraParams?: MkListParams) => Promise<import("@makroz/core").MkResponse<MkListResponse<unknown>>>;
|
|
60
|
+
/** Pagination meta from __extraData */
|
|
61
|
+
pagination: {
|
|
62
|
+
[key: string]: unknown;
|
|
63
|
+
current_page?: number;
|
|
64
|
+
last_page?: number;
|
|
65
|
+
per_page?: number;
|
|
66
|
+
total?: number;
|
|
67
|
+
};
|
|
68
|
+
status: import("@makroz/core").ApiStatus;
|
|
69
|
+
data: MkListResponse<unknown> | null;
|
|
70
|
+
error: unknown;
|
|
71
|
+
waiting: number;
|
|
72
|
+
loading: boolean;
|
|
73
|
+
get: <R = MkListResponse<unknown>>(endpoint: string, params?: Record<string, string | number | boolean | Record<string, any>> | null) => Promise<import("@makroz/core").MkResponse<R>>;
|
|
74
|
+
post: <R = MkListResponse<unknown>>(endpoint: string, body: Record<string, unknown> | FormData | null) => Promise<import("@makroz/core").MkResponse<R>>;
|
|
75
|
+
put: <R = MkListResponse<unknown>>(endpoint: string, body: Record<string, unknown> | FormData | null) => Promise<import("@makroz/core").MkResponse<R>>;
|
|
76
|
+
delete: (endpoint: string) => Promise<import("@makroz/core").MkResponse<void>>;
|
|
77
|
+
remove: (endpoint: string) => Promise<import("@makroz/core").MkResponse<void>>;
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=useMkList.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMkList.d.ts","sourceRoot":"","sources":["../../src/hooks/useMkList.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,WAAW,YAAY;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"useMkList.d.ts","sourceRoot":"","sources":["../../src/hooks/useMkList.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,WAAW,YAAY;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,wDAAwD;AACxD,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,OAAO;IACvC,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,WAAW,CAAC,EAAE;QACV,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KAC1B,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC1B,sBAAsB;IACtB,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,sEAAsE;IACtE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB;;;uBAiB7B,MAAM,SAAS,GAAG;oBAQrB,MAAM;mBAIP,MAAM;oBAIL,MAAM;2BAIC,MAAM;;4BA1B9B,YAAY;IA0D1B,uCAAuC;;;uBAvFxB,MAAM;oBACT,MAAM;mBACP,MAAM;gBACT,MAAM;;;;;;;;;;;;EAuFrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMkList.js","sourceRoot":"","sources":["../../src/hooks/useMkList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"useMkList.js","sourceRoot":"","sources":["../../src/hooks/useMkList.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export * from './components';
|
|
2
|
+
export * from './theme/MkThemeProvider';
|
|
3
|
+
export * from './context/MkApiContext';
|
|
4
|
+
export * from './context/MkConfirmContext';
|
|
5
|
+
export * from './context/MkToastContext';
|
|
6
|
+
export { MkAuthProvider } from './auth/MkAuthProvider';
|
|
7
|
+
export type { MkAuthProviderProps } from './auth/MkAuthProvider';
|
|
8
|
+
export { useMkAuth } from './auth/useMkAuth';
|
|
9
|
+
export { MkAuthForm } from './auth/MkAuthForm';
|
|
10
|
+
export type { MkAuthFormProps } from './auth/MkAuthForm';
|
|
11
|
+
export type { MkAuthContextValue } from './auth/MkAuthContext';
|
|
12
|
+
export type { AdminDto, AuthTokens, LoginInput, LoginResponse, RefreshResponse } from './auth/types';
|
|
13
|
+
export { getAccessToken, setAccessToken, getRefreshToken, setRefreshToken, getUser, setUser, clearAll, SECURE_KEYS, } from './auth/secureStorage';
|
|
14
|
+
export type { SecureKey } from './auth/secureStorage';
|
|
15
|
+
export * from './hooks/useApi';
|
|
16
|
+
export * from './hooks/useMkList';
|
|
17
|
+
export * from './hooks/useMkInfiniteList';
|
|
18
|
+
export * from './hooks/useMkDebounce';
|
|
19
|
+
export * from './hooks/useMkEffectDebug';
|
|
20
|
+
export * from './hooks/useMkEvent';
|
|
21
|
+
export * from './hooks/useMkLocalStorage';
|
|
22
|
+
export * from './hooks/useMkPrevious';
|
|
23
|
+
export * from './hooks/useMkToggle';
|
|
24
|
+
export * from './hooks/useMkForm';
|
|
25
|
+
export * from './hooks/useMkCrud';
|
|
26
|
+
export * from './hooks/useMkFilePickerExpo';
|
|
27
|
+
export * from './hooks/useMkFilePickerCli';
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAC;AAG7B,cAAc,yBAAyB,CAAC;AAGxC,cAAc,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAC;AAG7B,cAAc,yBAAyB,CAAC;AAGxC,cAAc,wBAAwB,CAAC;AAGvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AAGzC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACrG,OAAO,EACH,cAAc,EACd,cAAc,EACd,eAAe,EACf,eAAe,EACf,OAAO,EACP,OAAO,EACP,QAAQ,EACR,WAAW,GACd,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGtD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAKlC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,8 @@ export * from './components';
|
|
|
4
4
|
export * from './theme/MkThemeProvider';
|
|
5
5
|
// Contexts
|
|
6
6
|
export * from './context/MkApiContext';
|
|
7
|
-
|
|
7
|
+
// Note: context/MkAuthContext is intentionally NOT re-exported here.
|
|
8
|
+
// It is kept for backward compatibility only (@deprecated). Import from src/auth/ instead.
|
|
8
9
|
export * from './context/MkConfirmContext';
|
|
9
10
|
export * from './context/MkToastContext';
|
|
10
11
|
// Auth (SecureStore-backed, MK-MOB-1.0.3)
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,cAAc,cAAc,CAAC;AAE7B,QAAQ;AACR,cAAc,yBAAyB,CAAC;AAExC,WAAW;AACX,cAAc,wBAAwB,CAAC;AACvC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,cAAc,cAAc,CAAC;AAE7B,QAAQ;AACR,cAAc,yBAAyB,CAAC;AAExC,WAAW;AACX,cAAc,wBAAwB,CAAC;AACvC,qEAAqE;AACrE,2FAA2F;AAC3F,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AAEzC,0CAA0C;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAI/C,OAAO,EACH,cAAc,EACd,cAAc,EACd,eAAe,EACf,eAAe,EACf,OAAO,EACP,OAAO,EACP,QAAQ,EACR,WAAW,GACd,MAAM,sBAAsB,CAAC;AAG9B,QAAQ;AACR,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAElC,kFAAkF;AAClF,6DAA6D;AAC7D,6EAA6E;AAC7E,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test setup for @makroz/mobile — jsdom env + global stubs.
|
|
3
|
+
*
|
|
4
|
+
* Note: react-native and @shopify/flash-list mocks are NOT done
|
|
5
|
+
* here. `vi.mock` in setup files is loaded after the test file
|
|
6
|
+
* imports, so the mocks wouldn't apply. Instead, each .test.tsx
|
|
7
|
+
* file should `import { rnMocks } from '../test-utils'` and call
|
|
8
|
+
* `rnMocks()` at the top, BEFORE importing the component.
|
|
9
|
+
*
|
|
10
|
+
* This file just provides:
|
|
11
|
+
* - ResizeObserver / IntersectionObserver stubs (jsdom missing)
|
|
12
|
+
* - LayoutAnimation / UIManager global stubs (RN missing in jsdom)
|
|
13
|
+
*/
|
|
14
|
+
declare class ResizeObserverStub {
|
|
15
|
+
observe(): void;
|
|
16
|
+
unobserve(): void;
|
|
17
|
+
disconnect(): void;
|
|
18
|
+
}
|
|
19
|
+
declare class IntersectionObserverStub {
|
|
20
|
+
readonly root: null;
|
|
21
|
+
readonly rootMargin = "";
|
|
22
|
+
readonly thresholds: ReadonlyArray<number>;
|
|
23
|
+
observe(): void;
|
|
24
|
+
unobserve(): void;
|
|
25
|
+
disconnect(): void;
|
|
26
|
+
takeRecords(): IntersectionObserverEntry[];
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=test-setup.d.ts.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export declare function rnMocks(): void;
|
|
3
|
+
declare function customRender(ui: React.ReactElement, options?: {
|
|
4
|
+
wrapper?: React.ComponentType<{
|
|
5
|
+
children: React.ReactNode;
|
|
6
|
+
}>;
|
|
7
|
+
}): {
|
|
8
|
+
toJSON: () => any;
|
|
9
|
+
unmount: () => any;
|
|
10
|
+
rerender: () => void;
|
|
11
|
+
};
|
|
12
|
+
export declare function renderWithProviders(ui: React.ReactElement, options?: {
|
|
13
|
+
wrapper?: React.ComponentType<{
|
|
14
|
+
children: React.ReactNode;
|
|
15
|
+
}>;
|
|
16
|
+
}): {
|
|
17
|
+
toJSON: () => any;
|
|
18
|
+
unmount: () => any;
|
|
19
|
+
rerender: () => void;
|
|
20
|
+
};
|
|
21
|
+
export { customRender as render };
|
|
22
|
+
//# sourceMappingURL=test-utils.d.ts.map
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { MkTheme } from '@makroz/core';
|
|
3
|
+
interface ThemeContextType {
|
|
4
|
+
theme: MkTheme;
|
|
5
|
+
isDark: boolean;
|
|
6
|
+
toggleTheme: () => void;
|
|
7
|
+
}
|
|
8
|
+
export declare const MkThemeProvider: React.FC<{
|
|
9
|
+
children: React.ReactNode;
|
|
10
|
+
initialDark?: boolean;
|
|
11
|
+
}>;
|
|
12
|
+
export declare const useMkTheme: () => ThemeContextType;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=MkThemeProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MkThemeProvider.d.ts","sourceRoot":"","sources":["../../src/theme/MkThemeProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"MkThemeProvider.d.ts","sourceRoot":"","sources":["../../src/theme/MkThemeProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoE,MAAM,OAAO,CAAC;AACzF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAG5C,UAAU,gBAAgB;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB;AAID,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,CAa1F,CAAC;AAEF,eAAO,MAAM,UAAU,wBAMtB,CAAC"}
|
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { createContext, useContext, useState, useMemo } from 'react';
|
|
2
|
+
import { createContext, useContext, useState, useMemo, useCallback } from 'react';
|
|
3
3
|
import { tokens } from '@makroz/core';
|
|
4
4
|
const ThemeContext = createContext(undefined);
|
|
5
5
|
export const MkThemeProvider = ({ children, initialDark = false }) => {
|
|
6
6
|
const [isDark, setIsDark] = useState(initialDark);
|
|
7
7
|
const theme = useMemo(() => (isDark ? tokens.dark : tokens.light), [isDark]);
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
isDark,
|
|
11
|
-
toggleTheme: () => setIsDark(!isDark),
|
|
12
|
-
};
|
|
8
|
+
const toggleTheme = useCallback(() => setIsDark(prev => !prev), []);
|
|
9
|
+
const value = useMemo(() => ({ theme, isDark, toggleTheme }), [theme, isDark, toggleTheme]);
|
|
13
10
|
return _jsx(ThemeContext.Provider, { value: value, children: children });
|
|
14
11
|
};
|
|
15
12
|
export const useMkTheme = () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MkThemeProvider.js","sourceRoot":"","sources":["../../src/theme/MkThemeProvider.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"MkThemeProvider.js","sourceRoot":"","sources":["../../src/theme/MkThemeProvider.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEzF,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAQtC,MAAM,YAAY,GAAG,aAAa,CAA+B,SAAS,CAAC,CAAC;AAE5E,MAAM,CAAC,MAAM,eAAe,GAAmE,CAAC,EAC9F,QAAQ,EACR,WAAW,GAAG,KAAK,EACpB,EAAE,EAAE;IACH,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IAElD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAE7E,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAEpE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IAE5F,OAAO,KAAC,YAAY,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAAyB,CAAC;AACjF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE;IAC7B,MAAM,OAAO,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IACzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MkThemeProvider.test.d.ts","sourceRoot":"","sources":["../../src/theme/MkThemeProvider.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { describe, it, expect } from 'vitest';
|
|
3
|
+
import { renderHook, act } from '@testing-library/react-native';
|
|
4
|
+
import { MkThemeProvider, useMkTheme } from './MkThemeProvider';
|
|
5
|
+
describe('MkThemeProvider referential stability', () => {
|
|
6
|
+
it('should keep the context value reference stable across renders', () => {
|
|
7
|
+
const wrapper = ({ children }) => (_jsx(MkThemeProvider, { children: children }));
|
|
8
|
+
const { result, rerender } = renderHook(() => useMkTheme(), { wrapper });
|
|
9
|
+
const firstValue = result.current;
|
|
10
|
+
rerender(() => useMkTheme());
|
|
11
|
+
const secondValue = result.current;
|
|
12
|
+
expect(firstValue).toBe(secondValue);
|
|
13
|
+
});
|
|
14
|
+
it('should update the context value reference when isDark changes', () => {
|
|
15
|
+
const wrapper = ({ children }) => (_jsx(MkThemeProvider, { children: children }));
|
|
16
|
+
const { result } = renderHook(() => useMkTheme(), { wrapper });
|
|
17
|
+
const firstValue = result.current;
|
|
18
|
+
act(() => {
|
|
19
|
+
result.current.toggleTheme();
|
|
20
|
+
});
|
|
21
|
+
expect(result.current).not.toBe(firstValue);
|
|
22
|
+
expect(result.current.isDark).toBe(true);
|
|
23
|
+
});
|
|
24
|
+
it('should keep toggleTheme reference stable across renders', () => {
|
|
25
|
+
const wrapper = ({ children }) => (_jsx(MkThemeProvider, { children: children }));
|
|
26
|
+
const { result, rerender } = renderHook(() => useMkTheme(), { wrapper });
|
|
27
|
+
const firstToggle = result.current.toggleTheme;
|
|
28
|
+
rerender(() => useMkTheme());
|
|
29
|
+
expect(result.current.toggleTheme).toBe(firstToggle);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=MkThemeProvider.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MkThemeProvider.test.js","sourceRoot":"","sources":["../../src/theme/MkThemeProvider.test.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEhE,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACnD,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACrE,MAAM,OAAO,GAAG,CAAC,EAAE,QAAQ,EAAiC,EAAE,EAAE,CAAC,CAC7D,KAAC,eAAe,cAAE,QAAQ,GAAmB,CAChD,CAAC;QAEF,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACzE,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC;QAElC,QAAQ,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC;QAC7B,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC;QAEnC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACrE,MAAM,OAAO,GAAG,CAAC,EAAE,QAAQ,EAAiC,EAAE,EAAE,CAAC,CAC7D,KAAC,eAAe,cAAE,QAAQ,GAAmB,CAChD,CAAC;QAEF,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/D,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC;QAElC,GAAG,CAAC,GAAG,EAAE;YACL,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QAC/D,MAAM,OAAO,GAAG,CAAC,EAAE,QAAQ,EAAiC,EAAE,EAAE,CAAC,CAC7D,KAAC,eAAe,cAAE,QAAQ,GAAmB,CAChD,CAAC;QAEF,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACzE,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAE/C,QAAQ,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC;QAE7B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@makroz/mobile",
|
|
3
|
-
"version": "1.1
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "React Native UI components and hooks for MK-Director mobile applications",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -25,11 +25,23 @@
|
|
|
25
25
|
"url": "https://github.com/condaty/mk-director.git",
|
|
26
26
|
"directory": "packages/mk-mobile"
|
|
27
27
|
},
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "tsc",
|
|
30
|
+
"lint": "eslint src/",
|
|
31
|
+
"lint:fix": "eslint src/ --fix",
|
|
32
|
+
"lint:render-tests": "node scripts/lint-render-tests.mjs",
|
|
33
|
+
"lint:render-tests:json": "node scripts/lint-render-tests.mjs --json",
|
|
34
|
+
"test": "vitest run",
|
|
35
|
+
"test:watch": "vitest",
|
|
36
|
+
"test:coverage": "vitest run --coverage",
|
|
37
|
+
"type-check": "tsc --noEmit",
|
|
38
|
+
"clean": "rm -rf dist"
|
|
39
|
+
},
|
|
28
40
|
"dependencies": {
|
|
41
|
+
"@makroz/core": "workspace:*",
|
|
29
42
|
"@react-native-async-storage/async-storage": "^3.0.2",
|
|
30
43
|
"@shopify/flash-list": "^2.0.0",
|
|
31
|
-
"react-native-svg": "^15.15.4"
|
|
32
|
-
"@makroz/core": "1.0.1"
|
|
44
|
+
"react-native-svg": "^15.15.4"
|
|
33
45
|
},
|
|
34
46
|
"peerDependencies": {
|
|
35
47
|
"@shopify/flash-list": ">=2.0.0",
|
|
@@ -55,17 +67,5 @@
|
|
|
55
67
|
"typescript": "^5.7.0",
|
|
56
68
|
"vite": "^5.4.21",
|
|
57
69
|
"vitest": "^3.0.0"
|
|
58
|
-
},
|
|
59
|
-
"scripts": {
|
|
60
|
-
"build": "tsc",
|
|
61
|
-
"lint": "eslint src/",
|
|
62
|
-
"lint:fix": "eslint src/ --fix",
|
|
63
|
-
"lint:render-tests": "node scripts/lint-render-tests.mjs",
|
|
64
|
-
"lint:render-tests:json": "node scripts/lint-render-tests.mjs --json",
|
|
65
|
-
"test": "vitest run",
|
|
66
|
-
"test:watch": "vitest",
|
|
67
|
-
"test:coverage": "vitest run --coverage",
|
|
68
|
-
"type-check": "tsc --noEmit",
|
|
69
|
-
"clean": "rm -rf dist"
|
|
70
70
|
}
|
|
71
|
-
}
|
|
71
|
+
}
|
package/LICENSE
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
# LICENSE
|
|
2
|
-
|
|
3
|
-
**Proprietary License - MK-Director**
|
|
4
|
-
|
|
5
|
-
Copyright (c) 2026 Condaty. All rights reserved.
|
|
6
|
-
|
|
7
|
-
This software and associated documentation files (the "Software") are the proprietary property of Condaty ("Owner"). The Software may not be copied, modified, merged, published, distributed, sublicensed, and/or sold without the express written permission of the Owner.
|
|
8
|
-
|
|
9
|
-
## Terms of Use
|
|
10
|
-
|
|
11
|
-
1. **Authorization**: Access to this software is granted only to authorized users who have purchased a valid license from Condaty.
|
|
12
|
-
|
|
13
|
-
2. **Restrictions**: Without prior written permission from the Owner, you may not:
|
|
14
|
-
- Copy, modify, or create derivative works
|
|
15
|
-
- Distribute, sublicense, or sell copies of the Software
|
|
16
|
-
- Reverse engineer, decompile, or disassemble the Software
|
|
17
|
-
- Use the Software for commercial purposes without a valid license
|
|
18
|
-
|
|
19
|
-
3. **No Warranty**: THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
20
|
-
|
|
21
|
-
4. **Liability**: IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
|
-
|
|
23
|
-
5. **Termination**: This license is effective until terminated. Your rights under this license will terminate automatically without notice if you fail to comply with any of its terms and conditions.
|
|
24
|
-
|
|
25
|
-
## Contact
|
|
26
|
-
|
|
27
|
-
For licensing inquiries, please contact:
|
|
28
|
-
- **Email**: licensing@condaty.com
|
|
29
|
-
- **Website**: https://www.conday.com
|
|
30
|
-
|
|
31
|
-
---
|
|
32
|
-
|
|
33
|
-
*Last updated: April 2026*
|