LogoutManager
Cierra la sesión según las respuestas de fetch. De forma predeterminada se activa con las respuestas de estado 401 (Unauthorized).
implements
LogoutManager implements Manager
Uso
- Web
- React Native
- NextJS
- Expo
index.tsx
import {
DataProvider,
LogoutManager,
getDefaultManagers,
} from '@data-client/react';
import { createRoot } from 'react-dom/client';
import App from './App';
const managers = [new LogoutManager(), ...getDefaultManagers()];
createRoot(document.body).render(
<DataProvider managers={managers}>
<App />
</DataProvider>,
);
index.tsx
import {
DataProvider,
LogoutManager,
getDefaultManagers,
} from '@data-client/react';
import { AppRegistry } from 'react-native';
import App from './App';
const managers = [new LogoutManager(), ...getDefaultManagers()];
const Root = () => (
<DataProvider managers={managers}>
<App />
</DataProvider>
);
AppRegistry.registerComponent('MyApp', () => Root);
app/Provider.tsx
'use client';
import { LogoutManager, getDefaultManagers } from '@data-client/react';
import { DataProvider } from '@data-client/react/nextjs';
const managers = [new LogoutManager(), ...getDefaultManagers()];
export default function Provider({
children,
}: {
children: React.ReactNode;
}) {
return <DataProvider managers={managers}>{children}</DataProvider>;
}
app/layout.tsx
import Provider from './Provider';
export default function RootLayout({ children }) {
return (
<html>
<body>
<Provider>{children}</Provider>
</body>
</html>
);
}
app/_layout.tsx
import { Stack } from 'expo-router';
import {
DataProvider,
LogoutManager,
getDefaultManagers,
} from '@data-client/react';
const managers = [new LogoutManager(), ...getDefaultManagers()];
export default function RootLayout() {
return (
<DataProvider managers={managers}>
<Stack>
<Stack.Screen name="index" />
</Stack>
</DataProvider>
);
}
Manejador de logout personalizado
import { unAuth } from '../authentication';
const managers = [
new LogoutManager({
handleLogout(controller) {
// call custom unAuth function we defined
unAuth();
// still reset the store
controller.resetEntireStore();
},
}),
...getDefaultManagers(),
];
consejo
Usa controller.invalidateAll para borrar solo una parte de la caché.
import { unAuth } from '../authentication';
const myDomain = 'http://test.com';
const testKey = (key: string) => key.startsWith(`GET ${myDomain}`);
const managers = [
new LogoutManager({
handleLogout(controller) {
// call custom unAuth function we defined
unAuth();
// still reset the store
controller.invalidateAll({ testKey });
},
}),
...getDefaultManagers(),
];
Miembros
handleLogout(controller)
De forma predeterminada simplemente llama a controller.resetEntireStore()
Esto debería ser suficiente si el estado de inicio de sesión se determina por la existencia de una entidad de usuario en el store de Reactive Data Client. Sin embargo, puedes sobrescribir este método mediante herencia si hay que hacer más cosas.
shouldLogout(error)
protected shouldLogout(error: UnknownError) {
// 401 indicates reauthorization is needed
return error.status === 401;
}
Ejemplo de Github
Explora el ejemplo github-app