next.js/test/e2e/app-dir/cache-components/app/headers/exercise/components.tsx
components.tsx342 lines6.8 KB
export function AllComponents<T extends Headers>({
  headers,
  xSentinelValues,
  expression,
}: {
  headers: T
  xSentinelValues: Set<string>
  expression: string
}) {
  return (
    <>
      <Append headers={headers} expression={expression} />
      <Delete headers={headers} expression={expression} />
      <Get headers={headers} expression={expression} />
      <Has headers={headers} expression={expression} />
      <SetExercise headers={headers} expression={expression} />
      <GetSetCookie headers={headers} expression={expression} />
      <ForEach headers={headers} expression={expression} />
      <Keys headers={headers} expression={expression} />
      <Values
        headers={headers}
        expression={expression}
        xSentinelValues={xSentinelValues}
      />
      <Entries headers={headers} expression={expression} />
      <ForOf headers={headers} expression={expression} />
      <Spread headers={headers} expression={expression} />
    </>
  )
}

function Append({
  headers,
  expression,
}: {
  headers: Headers
  expression: string
}) {
  let result: string
  try {
    headers.append('x-sentinel', ' world')
    result = 'no error'
  } catch (e) {
    result = e.message
  }
  return (
    <section>
      <h2>{expression}.append('...')</h2>
      <ul>
        <li>
          <label>{expression}.append('x-sentinel', ' world')</label>
          <span id={'append-result-x-sentinel'}>: {result}</span>
        </li>
        <li>
          <label>x-sentinel value</label>
          <span id={'append-value-x-sentinel'}>
            : {headers.get('x-sentinel')}
          </span>
        </li>
      </ul>
    </section>
  )
}

function Delete({
  headers,
  expression,
}: {
  headers: Headers
  expression: string
}) {
  let result = 'no error'
  try {
    headers.delete('x-sentinel')
  } catch (e) {
    result = e.message
  }
  return (
    <section>
      <h2>{expression}.delete('...')</h2>
      <ul>
        <li>
          <label>{expression}.delete('x-sentinel')</label>
          <span id={'delete-result-x-sentinel'}>: {result}</span>
        </li>
        <li>
          <label>x-sentinel value</label>
          <span id={'delete-value-x-sentinel'}>
            : {headers.get('x-sentinel')}
          </span>
        </li>
      </ul>
    </section>
  )
}

function Get({
  headers,
  expression,
}: {
  headers: Headers
  expression: string
}) {
  return (
    <section>
      <h2>{expression}.get('...')</h2>
      <div>
        <pre id={'get-x-sentinel'}>{headers.get('x-sentinel')}</pre>
      </div>
    </section>
  )
}

function Has({
  headers,
  expression,
}: {
  headers: Headers
  expression: string
}) {
  return (
    <section>
      <h2>{expression}.has('...')</h2>
      <ul>
        <li>
          <label>x-sentinel</label>
          <span id={'has-x-sentinel'}>: {'' + headers.has('x-sentinel')}</span>
        </li>
        <li>
          <label>x-sentinel-foobar</label>
          <span id={'has-x-sentinel-foobar'}>
            : {'' + headers.has('x-sentinel-foobar')}
          </span>
        </li>
      </ul>
    </section>
  )
}

function SetExercise({
  headers,
  expression,
}: {
  headers: Headers
  expression: string
}) {
  let result = 'no error'
  try {
    headers.set('x-sentinel', 'goodbye')
  } catch (e) {
    result = e.message
  }
  return (
    <section>
      <h2>{expression}.set('...')</h2>
      <ul>
        <li>
          <label>{expression}.set('x-sentinel', 'goodbye')</label>
          <span id={'set-result-x-sentinel'}>: {result}</span>
        </li>
        <li>
          <label>x-sentinel value</label>
          <span id={'set-value-x-sentinel'}>: {headers.get('x-sentinel')}</span>
        </li>
      </ul>
    </section>
  )
}

function GetSetCookie({
  headers,
  expression,
}: {
  headers: Headers
  expression: string
}) {
  const result = headers.getSetCookie()
  return (
    <section>
      <h2>{expression}.getSetCookie()</h2>
      <pre id="get-set-cookie">{JSON.stringify(result, null, 2)}</pre>
    </section>
  )
}

function ForEach({
  headers,
  expression,
}: {
  headers: Headers
  expression: string
}) {
  let output = []
  headers.forEach((value, header) => {
    if (header.startsWith('x-sentinel')) {
      output.push(
        <div key={header}>
          <pre id={'for-each-' + header}>{value}</pre>
        </div>
      )
    }
  })

  return (
    <section>
      <h2>{expression}.forEach(...)</h2>
      {output.length ? output : <div>no headers found</div>}
    </section>
  )
}

function Keys({
  headers,
  expression,
}: {
  headers: Headers
  expression: string
}) {
  let output = []
  for (let header of headers.keys()) {
    if (header.startsWith('x-sentinel')) {
      output.push(
        <li key={header} id={'keys-' + header}>
          {header}
        </li>
      )
    }
  }

  return (
    <section>
      <h2>{expression}.keys(...)</h2>
      {output.length ? <ul>{output}</ul> : <div>no headers found</div>}
    </section>
  )
}

function Values({
  headers,
  expression,
  xSentinelValues,
}: {
  headers: Headers
  expression: string
  xSentinelValues: Set<string>
}) {
  let output = []
  for (let value of headers.values()) {
    if (xSentinelValues.has(value)) {
      output.push(
        <li key={value} data-class={'values'}>
          {value}
        </li>
      )
    }
  }

  return (
    <section>
      <h2>{expression}.values()</h2>
      {output.length ? <ul>{output}</ul> : <div>no headers found</div>}
    </section>
  )
}

function Entries({
  headers,
  expression,
}: {
  headers: Headers
  expression: string
}) {
  let output = []
  for (let entry of headers.entries()) {
    if (entry[0].startsWith('x-sentinel')) {
      output.push(
        <li key={entry[0]} id={'entries-' + entry[0]}>
          {entry[1]}
        </li>
      )
    }
  }

  return (
    <section>
      <h2>{expression}.entries()</h2>
      {output.length ? <ul>{output}</ul> : <div>no headers found</div>}
    </section>
  )
}

function ForOf({
  headers,
  expression,
}: {
  headers: Headers
  expression: string
}) {
  let output = []
  for (let [headerName, value] of headers) {
    if (headerName.startsWith('x-sentinel')) {
      output.push(
        <div key={headerName}>
          <pre id={'for-of-' + headerName}>{value}</pre>
        </div>
      )
    }
  }

  return (
    <section>
      <h2>for...of {expression}</h2>
      {output.length ? output : <div>no headers found</div>}
    </section>
  )
}

function Spread({
  headers,
  expression,
}: {
  headers: Headers
  expression: string
}) {
  let output = [...headers]
    .filter(([headerName]) => headerName.startsWith('x-sentinel'))
    .map((v) => {
      return (
        <div key={v[0]}>
          <pre id={'spread-' + v[0]}>{v[1]}</pre>
        </div>
      )
    })

  return (
    <section>
      <h2>...{expression}</h2>
      {output.length ? output : <div>no headers found</div>}
    </section>
  )
}
Quest for Codev2.0.0
/
SIGN IN