Scopes.tsx 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. import { OAuthScope } from '@supabase/shared-types/out/constants'
  2. import { ChevronDown } from 'lucide-react'
  3. import { Dispatch, PropsWithChildren, SetStateAction } from 'react'
  4. import {
  5. Button,
  6. DropdownMenu,
  7. DropdownMenuCheckboxItem,
  8. DropdownMenuContent,
  9. DropdownMenuLabel,
  10. DropdownMenuSeparator,
  11. DropdownMenuTrigger,
  12. } from 'ui'
  13. import { PERMISSIONS_DESCRIPTIONS } from '../OAuthApps.constants'
  14. const ScopeDropdownCheckboxItem = ({
  15. children,
  16. scopeName,
  17. scopes,
  18. onChange,
  19. }: PropsWithChildren<{
  20. scopeName: OAuthScope
  21. scopes: OAuthScope[]
  22. onChange: (v: OAuthScope[]) => void
  23. }>) => {
  24. return (
  25. <DropdownMenuCheckboxItem
  26. checked={scopes.includes(scopeName)}
  27. onCheckedChange={(checked) => {
  28. if (checked) {
  29. onChange([...scopes, scopeName])
  30. } else {
  31. onChange([...scopes.filter((s) => s !== scopeName)])
  32. }
  33. }}
  34. >
  35. {children}
  36. </DropdownMenuCheckboxItem>
  37. )
  38. }
  39. const Scope = ({
  40. title,
  41. description,
  42. readScopeName,
  43. writeScopeName,
  44. scopes,
  45. setScopes,
  46. }: {
  47. title: string
  48. description: string
  49. readScopeName: OAuthScope
  50. writeScopeName: OAuthScope
  51. scopes: OAuthScope[]
  52. setScopes: Dispatch<SetStateAction<OAuthScope[]>>
  53. }) => {
  54. let accessDescription = 'Access: No access'
  55. if (scopes.includes(readScopeName)) {
  56. accessDescription = 'Access: Read-only'
  57. }
  58. if (scopes.includes(writeScopeName)) {
  59. accessDescription = 'Access: Write-only'
  60. }
  61. if (scopes.includes(readScopeName) && scopes.includes(writeScopeName)) {
  62. accessDescription = 'Access: Read and write'
  63. }
  64. return (
  65. <div
  66. className="flex flex-row justify-between p-4 border first:rounded-t last:rounded-b gap-x-2"
  67. key={title}
  68. >
  69. <div className="flex flex-col">
  70. <span className="text-foreground text-sm">{title}</span>
  71. <span className="text-foreground-light text-xs capitalize-sentence">{description}</span>
  72. </div>
  73. <DropdownMenu>
  74. <DropdownMenuTrigger asChild>
  75. <Button type="default" iconRight={<ChevronDown />}>
  76. <p>{accessDescription}</p>
  77. </Button>
  78. </DropdownMenuTrigger>
  79. <DropdownMenuContent align="end" className="w-40">
  80. <DropdownMenuLabel>Select an access level</DropdownMenuLabel>
  81. <DropdownMenuSeparator />
  82. <ScopeDropdownCheckboxItem scopeName={readScopeName} scopes={scopes} onChange={setScopes}>
  83. Read
  84. </ScopeDropdownCheckboxItem>
  85. <ScopeDropdownCheckboxItem
  86. scopeName={writeScopeName}
  87. scopes={scopes}
  88. onChange={setScopes}
  89. >
  90. Write
  91. </ScopeDropdownCheckboxItem>
  92. </DropdownMenuContent>
  93. </DropdownMenu>
  94. </div>
  95. )
  96. }
  97. export const ScopesPanel = ({
  98. scopes,
  99. setScopes,
  100. }: {
  101. scopes: OAuthScope[]
  102. setScopes: Dispatch<SetStateAction<OAuthScope[]>>
  103. }) => {
  104. return (
  105. <div className="-space-y-px">
  106. <Scope
  107. title="Analytics"
  108. description={PERMISSIONS_DESCRIPTIONS.ANALYTICS}
  109. readScopeName={OAuthScope.ANALYTICS_READ}
  110. writeScopeName={OAuthScope.ANALYTICS_WRITE}
  111. scopes={scopes}
  112. setScopes={setScopes}
  113. />
  114. <Scope
  115. title="Analytics Config"
  116. description={PERMISSIONS_DESCRIPTIONS.ANALYTICS_CONFIG}
  117. readScopeName={OAuthScope.ANALYTICS_CONFIG_READ}
  118. writeScopeName={OAuthScope.ANALYTICS_CONFIG_WRITE}
  119. scopes={scopes}
  120. setScopes={setScopes}
  121. />
  122. <Scope
  123. title="Auth"
  124. description={PERMISSIONS_DESCRIPTIONS.AUTH}
  125. readScopeName={OAuthScope.AUTH_READ}
  126. writeScopeName={OAuthScope.AUTH_WRITE}
  127. scopes={scopes}
  128. setScopes={setScopes}
  129. />
  130. <Scope
  131. title="Database"
  132. description={PERMISSIONS_DESCRIPTIONS.DATABASE}
  133. readScopeName={OAuthScope.DATABASE_READ}
  134. writeScopeName={OAuthScope.DATABASE_WRITE}
  135. scopes={scopes}
  136. setScopes={setScopes}
  137. />
  138. <Scope
  139. title="Domains"
  140. description={PERMISSIONS_DESCRIPTIONS.DOMAINS}
  141. readScopeName={OAuthScope.DOMAINS_READ}
  142. writeScopeName={OAuthScope.DOMAINS_WRITE}
  143. scopes={scopes}
  144. setScopes={setScopes}
  145. />
  146. <Scope
  147. title="Edge Functions"
  148. description={PERMISSIONS_DESCRIPTIONS.EDGE_FUNCTIONS}
  149. readScopeName={OAuthScope.EDGE_FUNCTIONS_READ}
  150. writeScopeName={OAuthScope.EDGE_FUNCTIONS_WRITE}
  151. scopes={scopes}
  152. setScopes={setScopes}
  153. />
  154. <Scope
  155. title="Environment"
  156. description={PERMISSIONS_DESCRIPTIONS.ENVIRONMENT}
  157. readScopeName={OAuthScope.ENVIRONMENT_READ}
  158. writeScopeName={OAuthScope.ENVIRONMENT_WRITE}
  159. scopes={scopes}
  160. setScopes={setScopes}
  161. />
  162. <Scope
  163. title="Organizations"
  164. description={PERMISSIONS_DESCRIPTIONS.ORGANIZATIONS}
  165. readScopeName={OAuthScope.ORGANIZATIONS_READ}
  166. writeScopeName={OAuthScope.ORGANIZATIONS_WRITE}
  167. scopes={scopes}
  168. setScopes={setScopes}
  169. />
  170. <Scope
  171. title="Projects"
  172. description={PERMISSIONS_DESCRIPTIONS.PROJECTS}
  173. readScopeName={OAuthScope.PROJECTS_READ}
  174. writeScopeName={OAuthScope.PROJECTS_WRITE}
  175. scopes={scopes}
  176. setScopes={setScopes}
  177. />
  178. <Scope
  179. title="REST"
  180. description={PERMISSIONS_DESCRIPTIONS.REST}
  181. readScopeName={OAuthScope.REST_READ}
  182. writeScopeName={OAuthScope.REST_WRITE}
  183. scopes={scopes}
  184. setScopes={setScopes}
  185. />
  186. <Scope
  187. title="Secrets"
  188. description={PERMISSIONS_DESCRIPTIONS.SECRETS}
  189. readScopeName={OAuthScope.SECRETS_READ}
  190. writeScopeName={OAuthScope.SECRETS_WRITE}
  191. scopes={scopes}
  192. setScopes={setScopes}
  193. />
  194. <Scope
  195. title="Storage"
  196. description={PERMISSIONS_DESCRIPTIONS.STORAGE}
  197. readScopeName={OAuthScope.STORAGE_READ}
  198. writeScopeName={OAuthScope.STORAGE_WRITE}
  199. scopes={scopes}
  200. setScopes={setScopes}
  201. />
  202. </div>
  203. )
  204. }