LogoutManager
Faz logout com base nas respostas de fetch. Por padrão, isso é disparado por respostas com status 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>
);
}
Handler 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(),
];
dica
Use controller.invalidateAll para limpar apenas parte do cache.
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(),
];
Membros
handleLogout(controller)
Por padrão, simplesmente chama controller.resetEntireStore()
Isso deve ser suficiente se o estado de login for determinado pela existência de uma entity de usuário no store do Reactive Data Client. No entanto, você pode sobrescrever este método via herança se mais coisas precisarem ser feitas.
shouldLogout(error)
protected shouldLogout(error: UnknownError) {
// 401 indicates reauthorization is needed
return error.status === 401;
}
Exemplo do Github
Explore o exemplo github-app