@stackframe/stack 2.5.19 → 2.5.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/components/elements/sidebar-layout.d.mts +8 -9
  3. package/dist/components/elements/sidebar-layout.d.ts +8 -9
  4. package/dist/components/elements/sidebar-layout.js +45 -59
  5. package/dist/components/elements/sidebar-layout.js.map +1 -1
  6. package/dist/components/selected-team-switcher.js +8 -25
  7. package/dist/components/selected-team-switcher.js.map +1 -1
  8. package/dist/components/team-icon.d.mts +18 -0
  9. package/dist/components/team-icon.d.ts +18 -0
  10. package/dist/components/team-icon.js +50 -0
  11. package/dist/components/team-icon.js.map +1 -0
  12. package/dist/components-page/account-settings.d.mts +2 -1
  13. package/dist/components-page/account-settings.d.ts +2 -1
  14. package/dist/components-page/account-settings.js +385 -198
  15. package/dist/components-page/account-settings.js.map +1 -1
  16. package/dist/components-page/stack-handler.js +2 -24
  17. package/dist/components-page/stack-handler.js.map +1 -1
  18. package/dist/esm/components/elements/sidebar-layout.js +44 -47
  19. package/dist/esm/components/elements/sidebar-layout.js.map +1 -1
  20. package/dist/esm/components/selected-team-switcher.js +6 -13
  21. package/dist/esm/components/selected-team-switcher.js.map +1 -1
  22. package/dist/esm/components/team-icon.js +15 -0
  23. package/dist/esm/components/team-icon.js.map +1 -0
  24. package/dist/esm/components-page/account-settings.js +388 -202
  25. package/dist/esm/components-page/account-settings.js.map +1 -1
  26. package/dist/esm/components-page/stack-handler.js +2 -24
  27. package/dist/esm/components-page/stack-handler.js.map +1 -1
  28. package/dist/esm/lib/stack-app.js +11 -5
  29. package/dist/esm/lib/stack-app.js.map +1 -1
  30. package/dist/index.d.mts +1 -1
  31. package/dist/index.d.ts +1 -1
  32. package/dist/lib/stack-app.d.mts +6 -2
  33. package/dist/lib/stack-app.d.ts +6 -2
  34. package/dist/lib/stack-app.js +11 -5
  35. package/dist/lib/stack-app.js.map +1 -1
  36. package/package.json +4 -4
  37. package/dist/components-page/team-settings.d.mts +0 -8
  38. package/dist/components-page/team-settings.d.ts +0 -8
  39. package/dist/components-page/team-settings.js +0 -139
  40. package/dist/components-page/team-settings.js.map +0 -1
  41. package/dist/esm/components-page/team-settings.js +0 -115
  42. package/dist/esm/components-page/team-settings.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stackframe/stack",
3
- "version": "2.5.19",
3
+ "version": "2.5.20",
4
4
  "sideEffects": false,
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -40,9 +40,9 @@
40
40
  "tailwindcss-animate": "^1.0.7",
41
41
  "tsx": "^4.7.2",
42
42
  "yup": "^1.4.0",
43
- "@stackframe/stack-ui": "2.5.19",
44
- "@stackframe/stack-sc": "2.5.19",
45
- "@stackframe/stack-shared": "2.5.19"
43
+ "@stackframe/stack-sc": "2.5.20",
44
+ "@stackframe/stack-shared": "2.5.20",
45
+ "@stackframe/stack-ui": "2.5.20"
46
46
  },
47
47
  "peerDependencies": {
48
48
  "next": ">=14.1",
@@ -1,8 +0,0 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
-
3
- declare function TeamSettings(props: {
4
- fullPage?: boolean;
5
- teamId: string;
6
- }): react_jsx_runtime.JSX.Element;
7
-
8
- export { TeamSettings };
@@ -1,8 +0,0 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
-
3
- declare function TeamSettings(props: {
4
- fullPage?: boolean;
5
- teamId: string;
6
- }): react_jsx_runtime.JSX.Element;
7
-
8
- export { TeamSettings };
@@ -1,139 +0,0 @@
1
- "use client";
2
- "use strict";
3
- "use client";
4
- var __defProp = Object.defineProperty;
5
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
- var __getOwnPropNames = Object.getOwnPropertyNames;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
-
22
- // src/components-page/team-settings.tsx
23
- var team_settings_exports = {};
24
- __export(team_settings_exports, {
25
- TeamSettings: () => TeamSettings
26
- });
27
- module.exports = __toCommonJS(team_settings_exports);
28
- var import_stack_ui = require("@stackframe/stack-ui");
29
- var import_lucide_react = require("lucide-react");
30
- var import_react = require("react");
31
- var import__ = require("..");
32
- var import_sidebar_layout = require("../components/elements/sidebar-layout");
33
- var import_user_avatar = require("../components/elements/user-avatar");
34
- var import_jsx_runtime = require("react/jsx-runtime");
35
- function TeamSettings(props) {
36
- const user = (0, import__.useUser)({ or: "redirect" });
37
- const team = user.useTeam(props.teamId);
38
- if (!team) {
39
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import__.MessageCard, { title: "Team not found" });
40
- }
41
- const inner = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
42
- import_sidebar_layout.SidebarLayout,
43
- {
44
- items: [
45
- { title: "My Profile", content: profileSettings({ team }), icon: import_lucide_react.Contact, description: `Your profile in the team "${team.displayName}"` },
46
- { title: "Members", content: membersSettings({ team }), icon: import_lucide_react.Users },
47
- { title: "Team Info", content: managementSettings({ team }), icon: import_lucide_react.Info }
48
- // { title: 'Settings', content: userSettings({ team }), icon: Settings },
49
- ].filter(({ content }) => content),
50
- title: "Team Settings"
51
- }
52
- );
53
- if (props.fullPage) {
54
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.Container, { size: 800, className: "stack-scope", children: inner });
55
- } else {
56
- return inner;
57
- }
58
- }
59
- function managementSettings(props) {
60
- const user = (0, import__.useUser)({ or: "redirect" });
61
- const updateTeamPermission = user.usePermission(props.team, "$update_team");
62
- if (!updateTeamPermission) {
63
- return null;
64
- }
65
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
66
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.Label, { children: "Team display name" }),
67
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.EditableText, { value: props.team.displayName, onSave: () => {
68
- } })
69
- ] }) });
70
- }
71
- function profileSettings(props) {
72
- const user = (0, import__.useUser)({ or: "redirect" });
73
- const profile = user.useTeamProfile(props.team);
74
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex flex-col", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col", children: [
75
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_stack_ui.Label, { className: "flex gap-2", children: [
76
- "Display name ",
77
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.SimpleTooltip, { tooltip: "This overwrites your user display name in the account setting", type: "info" })
78
- ] }),
79
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
80
- import_stack_ui.EditableText,
81
- {
82
- value: profile.displayName || "",
83
- onSave: async (newDisplayName) => {
84
- await profile.update({ displayName: newDisplayName });
85
- }
86
- }
87
- )
88
- ] }) });
89
- }
90
- function membersSettings(props) {
91
- const [removeModalOpen, setRemoveModalOpen] = (0, import_react.useState)(false);
92
- const user = (0, import__.useUser)({ or: "redirect" });
93
- const removeMemberPermission = user.usePermission(props.team, "$remove_members");
94
- const readMemberPermission = user.usePermission(props.team, "$read_members");
95
- const inviteMemberPermission = user.usePermission(props.team, "$invite_members");
96
- const [email, setEmail] = (0, import_react.useState)("");
97
- const [invited, setInvited] = (0, import_react.useState)(false);
98
- if (!readMemberPermission && !inviteMemberPermission) {
99
- return null;
100
- }
101
- const users = props.team.useUsers();
102
- (0, import_react.useEffect)(() => {
103
- if (invited && email) {
104
- setInvited(false);
105
- }
106
- }, [email]);
107
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col gap-8", children: [
108
- inviteMemberPermission && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
109
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.Label, { children: "Invite a user to team" }),
110
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col gap-2 md:flex-row", children: [
111
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.Input, { placeholder: "Email", value: email, onChange: (e) => setEmail(e.target.value) }),
112
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.Button, { onClick: async () => {
113
- await props.team.inviteUser({ email });
114
- setEmail("");
115
- setInvited(true);
116
- }, children: "Invite" })
117
- ] }),
118
- invited && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.Typography, { type: "label", variant: "secondary", children: "User invited." })
119
- ] }),
120
- readMemberPermission && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
121
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.Label, { children: "Members" }),
122
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_stack_ui.Table, { children: [
123
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.TableHeader, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_stack_ui.TableRow, { children: [
124
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.TableHead, { className: "w-[100px]", children: "User" }),
125
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.TableHead, { className: "w-[200px]", children: "Name" })
126
- ] }) }),
127
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.TableBody, { children: users.map(({ id, teamProfile }, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_stack_ui.TableRow, { children: [
128
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.TableCell, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_user_avatar.UserAvatar, { user: teamProfile }) }),
129
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.TableCell, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.Typography, { children: teamProfile.displayName }) })
130
- ] }, id)) })
131
- ] })
132
- ] })
133
- ] }) });
134
- }
135
- // Annotate the CommonJS export names for ESM import in node:
136
- 0 && (module.exports = {
137
- TeamSettings
138
- });
139
- //# sourceMappingURL=team-settings.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/components-page/team-settings.tsx"],"sourcesContent":["'use client';\n\nimport { ActionCell, ActionDialog, Button, Container, EditableText, Input, Label, SimpleTooltip, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Typography } from \"@stackframe/stack-ui\";\nimport { Contact, Info, Settings, Users } from \"lucide-react\";\nimport { useEffect, useState } from \"react\";\nimport { MessageCard, Team, useStackApp, useUser } from \"..\";\nimport { SidebarLayout } from \"../components/elements/sidebar-layout\";\nimport { UserAvatar } from \"../components/elements/user-avatar\";\n\nexport function TeamSettings(props: { fullPage?: boolean, teamId: string }) {\n const user = useUser({ or: 'redirect' });\n const team = user.useTeam(props.teamId);\n\n if (!team) {\n return <MessageCard title='Team not found' />;\n }\n\n\n const inner = <SidebarLayout\n items={[\n { title: 'My Profile', content: profileSettings({ team }), icon: Contact, description: `Your profile in the team \"${team.displayName}\"` },\n { title: 'Members', content: membersSettings({ team }), icon: Users },\n { title: 'Team Info', content: managementSettings({ team }), icon: Info },\n // { title: 'Settings', content: userSettings({ team }), icon: Settings },\n ].filter(({ content }) => content as any)}\n title='Team Settings'\n />;\n\n if (props.fullPage) {\n return (\n <Container size={800} className='stack-scope'>\n {inner}\n </Container>\n );\n } else {\n return inner;\n }\n}\n\nfunction managementSettings(props: { team: Team }) {\n const user = useUser({ or: 'redirect' });\n const updateTeamPermission = user.usePermission(props.team, '$update_team');\n\n if (!updateTeamPermission) {\n return null;\n }\n\n return (\n <>\n <div>\n <Label>Team display name</Label>\n <EditableText value={props.team.displayName} onSave={() => {}}/>\n </div>\n </>\n );\n}\n\nfunction profileSettings(props: { team: Team }) {\n const user = useUser({ or: 'redirect' });\n const profile = user.useTeamProfile(props.team);\n\n return (\n <div className=\"flex flex-col\">\n <div className=\"flex flex-col\">\n <Label className=\"flex gap-2\">Display name <SimpleTooltip tooltip=\"This overwrites your user display name in the account setting\" type='info'/></Label>\n <EditableText\n value={profile.displayName || ''}\n onSave={async (newDisplayName) => {\n await profile.update({ displayName: newDisplayName });\n }}/>\n </div>\n </div>\n );\n}\n\nfunction userSettings(props: { team: Team }) {\n const app = useStackApp();\n const user = useUser({ or: 'redirect' });\n\n return (\n <div>\n <div>\n <Button\n variant='secondary'\n onClick={async () => {\n await user.leaveTeam(props.team);\n await app.redirectToHome();\n }}\n >\n Leave team\n </Button>\n </div>\n </div>\n );\n}\n\nfunction RemoveMemberDialog(props: {\n open?: boolean,\n onOpenChange?: (open: boolean) => void,\n}) {\n return (\n <ActionDialog\n open={props.open}\n onOpenChange={props.onOpenChange}\n title=\"Delete domain\"\n danger\n okButton={{\n label: \"Delete\",\n onClick: async () => {\n }\n }}\n cancelButton\n >\n <Typography>\n Do you really want to remove from the team?\n </Typography>\n </ActionDialog>\n );\n}\n\nfunction membersSettings(props: { team: Team }) {\n const [removeModalOpen, setRemoveModalOpen] = useState(false);\n const user = useUser({ or: 'redirect' });\n const removeMemberPermission = user.usePermission(props.team, '$remove_members');\n const readMemberPermission = user.usePermission(props.team, '$read_members');\n const inviteMemberPermission = user.usePermission(props.team, '$invite_members');\n const [email, setEmail] = useState('');\n const [invited, setInvited] = useState(false);\n\n if (!readMemberPermission && !inviteMemberPermission) {\n return null;\n }\n\n const users = props.team.useUsers();\n\n useEffect(() => {\n if (invited && email) {\n setInvited(false);\n }\n }, [email]);\n\n return (\n <>\n <div className=\"flex flex-col gap-8\">\n {inviteMemberPermission &&\n <div>\n <Label>Invite a user to team</Label>\n <div className=\"flex flex-col gap-2 md:flex-row\">\n <Input placeholder=\"Email\" value={email} onChange={e => setEmail(e.target.value)}/>\n <Button onClick={async () => {\n await props.team.inviteUser({ email });\n setEmail('');\n setInvited(true);\n }}>Invite</Button>\n </div>\n {invited && <Typography type='label' variant='secondary'>User invited.</Typography>}\n </div>}\n {readMemberPermission &&\n <div>\n <Label>Members</Label>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-[100px]\">User</TableHead>\n <TableHead className=\"w-[200px]\">Name</TableHead>\n {/* {removeMemberPermission && <TableHead className=\"w-[100px]\">Actions</TableHead>} */}\n </TableRow>\n </TableHeader>\n <TableBody>\n {users.map(({ id, teamProfile }, i) => (\n <TableRow key={id}>\n <TableCell>\n <UserAvatar user={teamProfile}/>\n </TableCell>\n <TableCell>\n <Typography>{teamProfile.displayName}</Typography>\n </TableCell>\n {/* {removeMemberPermission && <TableCell>\n <ActionCell items={[\n { item: 'Remove', onClick: () => setRemoveModalOpen(true), danger: true },\n ]}/>\n <RemoveMemberDialog open={removeModalOpen} onOpenChange={setRemoveModalOpen} />\n </TableCell>} */}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>}\n </div>\n </>\n );\n}"],"mappings":"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","names":[]}
@@ -1,115 +0,0 @@
1
- "use client";
2
- "use client";
3
-
4
- // src/components-page/team-settings.tsx
5
- import { ActionDialog, Button, Container, EditableText, Input, Label, SimpleTooltip, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Typography } from "@stackframe/stack-ui";
6
- import { Contact, Info, Users } from "lucide-react";
7
- import { useEffect, useState } from "react";
8
- import { MessageCard, useStackApp, useUser } from "..";
9
- import { SidebarLayout } from "../components/elements/sidebar-layout";
10
- import { UserAvatar } from "../components/elements/user-avatar";
11
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
12
- function TeamSettings(props) {
13
- const user = useUser({ or: "redirect" });
14
- const team = user.useTeam(props.teamId);
15
- if (!team) {
16
- return /* @__PURE__ */ jsx(MessageCard, { title: "Team not found" });
17
- }
18
- const inner = /* @__PURE__ */ jsx(
19
- SidebarLayout,
20
- {
21
- items: [
22
- { title: "My Profile", content: profileSettings({ team }), icon: Contact, description: `Your profile in the team "${team.displayName}"` },
23
- { title: "Members", content: membersSettings({ team }), icon: Users },
24
- { title: "Team Info", content: managementSettings({ team }), icon: Info }
25
- // { title: 'Settings', content: userSettings({ team }), icon: Settings },
26
- ].filter(({ content }) => content),
27
- title: "Team Settings"
28
- }
29
- );
30
- if (props.fullPage) {
31
- return /* @__PURE__ */ jsx(Container, { size: 800, className: "stack-scope", children: inner });
32
- } else {
33
- return inner;
34
- }
35
- }
36
- function managementSettings(props) {
37
- const user = useUser({ or: "redirect" });
38
- const updateTeamPermission = user.usePermission(props.team, "$update_team");
39
- if (!updateTeamPermission) {
40
- return null;
41
- }
42
- return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs("div", { children: [
43
- /* @__PURE__ */ jsx(Label, { children: "Team display name" }),
44
- /* @__PURE__ */ jsx(EditableText, { value: props.team.displayName, onSave: () => {
45
- } })
46
- ] }) });
47
- }
48
- function profileSettings(props) {
49
- const user = useUser({ or: "redirect" });
50
- const profile = user.useTeamProfile(props.team);
51
- return /* @__PURE__ */ jsx("div", { className: "flex flex-col", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
52
- /* @__PURE__ */ jsxs(Label, { className: "flex gap-2", children: [
53
- "Display name ",
54
- /* @__PURE__ */ jsx(SimpleTooltip, { tooltip: "This overwrites your user display name in the account setting", type: "info" })
55
- ] }),
56
- /* @__PURE__ */ jsx(
57
- EditableText,
58
- {
59
- value: profile.displayName || "",
60
- onSave: async (newDisplayName) => {
61
- await profile.update({ displayName: newDisplayName });
62
- }
63
- }
64
- )
65
- ] }) });
66
- }
67
- function membersSettings(props) {
68
- const [removeModalOpen, setRemoveModalOpen] = useState(false);
69
- const user = useUser({ or: "redirect" });
70
- const removeMemberPermission = user.usePermission(props.team, "$remove_members");
71
- const readMemberPermission = user.usePermission(props.team, "$read_members");
72
- const inviteMemberPermission = user.usePermission(props.team, "$invite_members");
73
- const [email, setEmail] = useState("");
74
- const [invited, setInvited] = useState(false);
75
- if (!readMemberPermission && !inviteMemberPermission) {
76
- return null;
77
- }
78
- const users = props.team.useUsers();
79
- useEffect(() => {
80
- if (invited && email) {
81
- setInvited(false);
82
- }
83
- }, [email]);
84
- return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-8", children: [
85
- inviteMemberPermission && /* @__PURE__ */ jsxs("div", { children: [
86
- /* @__PURE__ */ jsx(Label, { children: "Invite a user to team" }),
87
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 md:flex-row", children: [
88
- /* @__PURE__ */ jsx(Input, { placeholder: "Email", value: email, onChange: (e) => setEmail(e.target.value) }),
89
- /* @__PURE__ */ jsx(Button, { onClick: async () => {
90
- await props.team.inviteUser({ email });
91
- setEmail("");
92
- setInvited(true);
93
- }, children: "Invite" })
94
- ] }),
95
- invited && /* @__PURE__ */ jsx(Typography, { type: "label", variant: "secondary", children: "User invited." })
96
- ] }),
97
- readMemberPermission && /* @__PURE__ */ jsxs("div", { children: [
98
- /* @__PURE__ */ jsx(Label, { children: "Members" }),
99
- /* @__PURE__ */ jsxs(Table, { children: [
100
- /* @__PURE__ */ jsx(TableHeader, { children: /* @__PURE__ */ jsxs(TableRow, { children: [
101
- /* @__PURE__ */ jsx(TableHead, { className: "w-[100px]", children: "User" }),
102
- /* @__PURE__ */ jsx(TableHead, { className: "w-[200px]", children: "Name" })
103
- ] }) }),
104
- /* @__PURE__ */ jsx(TableBody, { children: users.map(({ id, teamProfile }, i) => /* @__PURE__ */ jsxs(TableRow, { children: [
105
- /* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsx(UserAvatar, { user: teamProfile }) }),
106
- /* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsx(Typography, { children: teamProfile.displayName }) })
107
- ] }, id)) })
108
- ] })
109
- ] })
110
- ] }) });
111
- }
112
- export {
113
- TeamSettings
114
- };
115
- //# sourceMappingURL=team-settings.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/components-page/team-settings.tsx"],"sourcesContent":["'use client';\n\nimport { ActionCell, ActionDialog, Button, Container, EditableText, Input, Label, SimpleTooltip, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Typography } from \"@stackframe/stack-ui\";\nimport { Contact, Info, Settings, Users } from \"lucide-react\";\nimport { useEffect, useState } from \"react\";\nimport { MessageCard, Team, useStackApp, useUser } from \"..\";\nimport { SidebarLayout } from \"../components/elements/sidebar-layout\";\nimport { UserAvatar } from \"../components/elements/user-avatar\";\n\nexport function TeamSettings(props: { fullPage?: boolean, teamId: string }) {\n const user = useUser({ or: 'redirect' });\n const team = user.useTeam(props.teamId);\n\n if (!team) {\n return <MessageCard title='Team not found' />;\n }\n\n\n const inner = <SidebarLayout\n items={[\n { title: 'My Profile', content: profileSettings({ team }), icon: Contact, description: `Your profile in the team \"${team.displayName}\"` },\n { title: 'Members', content: membersSettings({ team }), icon: Users },\n { title: 'Team Info', content: managementSettings({ team }), icon: Info },\n // { title: 'Settings', content: userSettings({ team }), icon: Settings },\n ].filter(({ content }) => content as any)}\n title='Team Settings'\n />;\n\n if (props.fullPage) {\n return (\n <Container size={800} className='stack-scope'>\n {inner}\n </Container>\n );\n } else {\n return inner;\n }\n}\n\nfunction managementSettings(props: { team: Team }) {\n const user = useUser({ or: 'redirect' });\n const updateTeamPermission = user.usePermission(props.team, '$update_team');\n\n if (!updateTeamPermission) {\n return null;\n }\n\n return (\n <>\n <div>\n <Label>Team display name</Label>\n <EditableText value={props.team.displayName} onSave={() => {}}/>\n </div>\n </>\n );\n}\n\nfunction profileSettings(props: { team: Team }) {\n const user = useUser({ or: 'redirect' });\n const profile = user.useTeamProfile(props.team);\n\n return (\n <div className=\"flex flex-col\">\n <div className=\"flex flex-col\">\n <Label className=\"flex gap-2\">Display name <SimpleTooltip tooltip=\"This overwrites your user display name in the account setting\" type='info'/></Label>\n <EditableText\n value={profile.displayName || ''}\n onSave={async (newDisplayName) => {\n await profile.update({ displayName: newDisplayName });\n }}/>\n </div>\n </div>\n );\n}\n\nfunction userSettings(props: { team: Team }) {\n const app = useStackApp();\n const user = useUser({ or: 'redirect' });\n\n return (\n <div>\n <div>\n <Button\n variant='secondary'\n onClick={async () => {\n await user.leaveTeam(props.team);\n await app.redirectToHome();\n }}\n >\n Leave team\n </Button>\n </div>\n </div>\n );\n}\n\nfunction RemoveMemberDialog(props: {\n open?: boolean,\n onOpenChange?: (open: boolean) => void,\n}) {\n return (\n <ActionDialog\n open={props.open}\n onOpenChange={props.onOpenChange}\n title=\"Delete domain\"\n danger\n okButton={{\n label: \"Delete\",\n onClick: async () => {\n }\n }}\n cancelButton\n >\n <Typography>\n Do you really want to remove from the team?\n </Typography>\n </ActionDialog>\n );\n}\n\nfunction membersSettings(props: { team: Team }) {\n const [removeModalOpen, setRemoveModalOpen] = useState(false);\n const user = useUser({ or: 'redirect' });\n const removeMemberPermission = user.usePermission(props.team, '$remove_members');\n const readMemberPermission = user.usePermission(props.team, '$read_members');\n const inviteMemberPermission = user.usePermission(props.team, '$invite_members');\n const [email, setEmail] = useState('');\n const [invited, setInvited] = useState(false);\n\n if (!readMemberPermission && !inviteMemberPermission) {\n return null;\n }\n\n const users = props.team.useUsers();\n\n useEffect(() => {\n if (invited && email) {\n setInvited(false);\n }\n }, [email]);\n\n return (\n <>\n <div className=\"flex flex-col gap-8\">\n {inviteMemberPermission &&\n <div>\n <Label>Invite a user to team</Label>\n <div className=\"flex flex-col gap-2 md:flex-row\">\n <Input placeholder=\"Email\" value={email} onChange={e => setEmail(e.target.value)}/>\n <Button onClick={async () => {\n await props.team.inviteUser({ email });\n setEmail('');\n setInvited(true);\n }}>Invite</Button>\n </div>\n {invited && <Typography type='label' variant='secondary'>User invited.</Typography>}\n </div>}\n {readMemberPermission &&\n <div>\n <Label>Members</Label>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-[100px]\">User</TableHead>\n <TableHead className=\"w-[200px]\">Name</TableHead>\n {/* {removeMemberPermission && <TableHead className=\"w-[100px]\">Actions</TableHead>} */}\n </TableRow>\n </TableHeader>\n <TableBody>\n {users.map(({ id, teamProfile }, i) => (\n <TableRow key={id}>\n <TableCell>\n <UserAvatar user={teamProfile}/>\n </TableCell>\n <TableCell>\n <Typography>{teamProfile.displayName}</Typography>\n </TableCell>\n {/* {removeMemberPermission && <TableCell>\n <ActionCell items={[\n { item: 'Remove', onClick: () => setRemoveModalOpen(true), danger: true },\n ]}/>\n <RemoveMemberDialog open={removeModalOpen} onOpenChange={setRemoveModalOpen} />\n </TableCell>} */}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>}\n </div>\n </>\n );\n}"],"mappings":"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","names":[]}