turash/bugulma/frontend/contexts/OrganizationContext.tsx
Damir Mukimov 6347f42e20
Consolidate repositories: Remove nested frontend .git and merge into main repository
- Remove nested git repository from bugulma/frontend/.git
- Add all frontend files to main repository tracking
- Convert from separate frontend/backend repos to unified monorepo
- Preserve all frontend code and development history as tracked files
- Eliminate nested repository complexity for simpler development workflow

This creates a proper monorepo structure with frontend and backend
coexisting in the same repository for easier development and deployment.
2025-11-25 06:02:57 +01:00

102 lines
3.3 KiB
TypeScript

import { createContext, ReactNode, useCallback, useMemo } from 'react';
import {
useCreateOrganization,
useDeleteOrganization,
useOrganizations as useOrganizationsAPI,
} from '@/hooks/api';
import type {
BackendOrganization,
CreateOrganizationRequest,
} from '@/schemas/backend/organization';
interface OrganizationContextType {
organizations: BackendOrganization[];
isLoading: boolean;
error: Error | null;
addOrganization: (newOrgData: CreateOrganizationRequest) => Promise<void>;
updateOrganization: () => Promise<void>;
deleteOrganization: (id: string) => Promise<void>;
getOrganizationById: (id: string | undefined) => BackendOrganization | undefined;
refetch: () => void;
}
export const OrganizationContext = createContext<OrganizationContextType | undefined>(undefined);
export const OrganizationProvider = ({ children }: { children?: ReactNode }) => {
const { data: organizations, isLoading, error, refetch } = useOrganizationsAPI();
const createOrgMutation = useCreateOrganization();
const deleteOrgMutation = useDeleteOrganization();
const addOrganization = useCallback(
async (newOrgData: CreateOrganizationRequest) => {
await createOrgMutation.mutateAsync(newOrgData);
refetch();
},
[createOrgMutation, refetch]
);
const updateOrganization = useCallback(async () => {
throw new Error('Organization updates are not yet supported by the backend API. This feature will be implemented when the backend adds support for organization updates.');
}, []);
const deleteOrganization = useCallback(
async (id: string) => {
await deleteOrgMutation.mutateAsync(id);
refetch();
},
[deleteOrgMutation, refetch]
);
const getOrganizationById = useCallback(
(id: string | undefined): BackendOrganization | undefined => {
if (!id || !organizations || !Array.isArray(organizations)) return undefined;
return organizations.find((org) => org.ID === id);
},
[organizations]
);
const value = useMemo(() => {
// Ensure organizations is always an array - don't block on undefined
const orgs = Array.isArray(organizations) ? organizations : [];
// Only log in development and avoid blocking with console operations
if (process.env.NODE_ENV === 'development') {
// Use setTimeout to defer logging and not block render
setTimeout(() => {
console.log(`[OrganizationContext] Loaded ${orgs.length} organizations`, {
isLoading,
hasError: !!error,
error: error?.message,
sample: orgs.slice(0, 3).map(org => ({ id: org?.ID, name: org?.Name })),
});
const orgsWithoutIds = orgs.filter((org) => !org?.ID || org.ID.trim() === '');
if (orgsWithoutIds.length > 0) {
console.warn(`Found ${orgsWithoutIds.length} organizations without valid IDs`);
}
}, 0);
}
return {
organizations: orgs,
isLoading,
error: error instanceof Error ? error : error ? new Error(String(error)) : null,
addOrganization,
updateOrganization,
deleteOrganization,
getOrganizationById,
refetch,
};
}, [
organizations,
isLoading,
error,
addOrganization,
updateOrganization,
deleteOrganization,
getOrganizationById,
refetch,
]);
return <OrganizationContext.Provider value={value}>{children}</OrganizationContext.Provider>;
};