Я пытался это выяснить (впервые в GraphQL + Apollo). Я получил свою директиву «работает» (логическое значение изменяет часть фрагмента, которая называется, как предполагалось). Проблема в том, чтобы написать выражение, которое возвращает мою переменную директивы, мне нужен результирующий запрос, по которому вызывается директива! Я не знаю, как преодолеть это противоречие, и вбрасываю полотенце в надежде, что кто-то более опытный сможет направить меня в лучшем направлении.
Вот запрос и крючок, на который он вызывается:
export const getDatasetPage = gql`
query dataset($datasetId: ID!, $editTrue: Boolean!) {
dataset(id: $datasetId) {
id
created
public
following
starred
...DatasetDraft //editTrue omits a piece of this fragment if user !hasEditPermissions
...DatasetPermissions
...DatasetSnapshots
...DatasetIssues
...DatasetMetadata
...DatasetComments
uploader {
id
name
email
}
analytics {
downloads
views
}
onBrainlife
}
}
${DatasetQueryFragments.DRAFT_FRAGMENT}
${DatasetQueryFragments.PERMISSION_FRAGMENT}
${DatasetQueryFragments.DATASET_SNAPSHOTS}
${DatasetQueryFragments.DATASET_ISSUES}
${DatasetQueryFragments.DATASET_METADATA}
${DATASET_COMMENTS}
`
// IDEAL CONDITION TO CHECK WRITE PERMISSIONS (won't work because dataset is required //prop...which is the result of the query)
// const editTrue = (dataset) => {
// const user = getProfile()
// return (user && user.admin) ||
// hasEditPermissions(dataset.permissions, user && user.sub)
// }
export const DatasetQueryHook = ({ datasetId, editTrue }) => {
const {
data: { dataset },
loading,
error,
} = useQuery(getDatasetPage, {
variables: { datasetId, editTrue },
})
if (loading) {
return <Spinner text="Loading Dataset" active />
} else {
if (error) Sentry.captureException(error)
return (
<ErrorBoundary error={error} subject={'error in dataset page'}>
<DatasetQueryContext.Provider
value={{
datasetId,
}}>
<DatasetPage dataset={dataset} />
</DatasetQueryContext.Provider>
</ErrorBoundary>
)
}
}
const DatasetQuery = ({ match }) => (
<ErrorBoundaryAssertionFailureException subject={'error in dataset query'}>
<DatasetQueryHook datasetId={match.params.datasetId} editTrue={editTrue} />
</ErrorBoundaryAssertionFailureException>
)
...
После прочтения множества документов gql я просто разочарован тем, что после того, как, наконец, удалось реализовать директиву для фрагмента фрагмента, я столкнулся с проблемой, заключающейся в том, что сам запрос создает важный фрагмент данных. это определяет, что это за директива.
Чтобы добавить некоторый контекст, я в основном пытаюсь пропустить определенные файлы, запрашиваемые, когда у пользователя нет прав на запись в них. В настоящее время они запрашиваются для всех пользователей, несмотря на то, что они не отображаются, что приводит к значительному времени загрузки.