invertase / invertase/tanstack-query-firebase

How do I pass variables to hooks?

Open
#80 2 comments 0 reactions 0 assignees View on GitHub
react-query-firebase
Dominant language
TypeScript
Stars
462
Forks
69
PR merge metrics
No merged PRs in 30d

Description

When I've used React Query before, I used it as a hook. Like Tanner showed in this demo: https://youtu.be/DocXo3gqGdI?t=2817

And also in the React Query Docs, https://tanstack.com/query/v4/docs/guides/mutations
It shows how data can be passed into a useMutation that runs inside mutationFn. This allows you to abstract a 'useUpdateMyData' hook, or something like that. And it has all of the fetching logic inside, and you just pass a small amount of data to make it mutate different documents.
```
function App() {
const mutation = useMutation({
mutationFn: newTodo => { // Right here, data comes in as newTodo
return axios.post('/todos', newTodo)
}
})

return (


{mutation.isLoading ? (
'Adding todo...'
) : (
<>
{mutation.isError ? (
An error occurred: {mutation.error.message}

) : null}

{mutation.isSuccess ?

Todo added!
: null}

{
mutation.mutate({ id: new Date(), title: 'Do Laundry' })
}}
>
Create Todo


)}


)
}
```

I incorporated that into custom hooks on other projects:

```
import 'react-native-get-random-values';
import Constants from 'expo-constants';
import { useMutation, useQueryClient } from 'react-query';
import getDbName from '../../utils/loadDatabaseName';
const CosmosClient = require('@azure/cosmos').CosmosClient;

const containerId = 'logbooks';

export const useDeleteLogbook = () => {
const queryClient = useQueryClient();
const { mutate: deleteLogbook } = useMutation(
newLogbook => mutation(newLogbook),
{
onSuccess: () => {
queryClient.invalidateQueries('logbooks');
},
}
);
return { deleteLogbook };
};

const mutation = async logbook => { // Right here, my dynamic data comes into my hook as 'logbook'
const endpoint = await Constants.manifest.extra.cosmosEndpoint;
const key = await Constants.manifest.extra.cosmosKey;
const databaseId = await getDbName();
const client = new CosmosClient({ endpoint, key });

await client
.database(databaseId)
.container(containerId)
.item(logbook.id, logbook.userId)
.delete();
};

```

Then in my code, I could use the hook and it was incredibly clean:
```

// Inside react component:
const { deleteLogbook } = useDeleteLogbook();
onPress: () => deleteLogbook(logbook),

```

But now I'm trying to do the same thing with this package, and I'm running into trouble.

I've implemented a custom deletion hook like so. But I can't find a way to pass dynamic variables in as before.
```
import { collection, doc } from 'firebase/firestore';
import { useFirestoreDocumentDeletion } from '@react-query-firebase/firestore';
import { db } from '../../utils/firebase';

export const useDeleteLogbook = () => {
const collection = collection(db, 'logbooks');
const ref = doc(collection, '456');// I want to pass a dynamic value here instead of 456
const { mutation: deleteLogbook } = useFirestoreDocumentDeletion(ref);
return { deleteLogbook };
};

```

According to your example, you call the mutate function with no data passed in. Just mutation.mutate()

```
{
mutation.mutate(); // No data passed in
}}
>
Delete document

```
https://react-query-firebase.invertase.dev/firestore/data-mutation

So I'm wondering, how do we implement this with dynamic data? For example, if I have a list, where each item has a delete button. How do I pass in mutation.mutate() so that my react-query-firebase code can delete the correct document?

Could you point me in the right direction or give me a small example?

I tried reading the code of this package, but I'm not great with typescript yet.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.