Директива GraphQL требует свой собственный результат запроса в качестве переменной. Какой умный способ сделать это? - PullRequest
0 голосов
/ 07 октября 2019

Я пытался это выяснить (впервые в 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 я просто разочарован тем, что после того, как, наконец, удалось реализовать директиву для фрагмента фрагмента, я столкнулся с проблемой, заключающейся в том, что сам запрос создает важный фрагмент данных. это определяет, что это за директива.

Чтобы добавить некоторый контекст, я в основном пытаюсь пропустить определенные файлы, запрашиваемые, когда у пользователя нет прав на запись в них. В настоящее время они запрашиваются для всех пользователей, несмотря на то, что они не отображаются, что приводит к значительному времени загрузки.

...