Compare commits

..

12 Commits

Author SHA1 Message Date
oguzhankoral e71714e282 Set inputs for mapped definition 2024-01-08 16:18:51 +03:00
oguzhankoral a6351659da Use insertion point for instances 2024-01-08 14:33:11 +03:00
oguzhankoral 80f62e6ee4 Fix transformation matrix 2024-01-08 12:17:48 +03:00
oguzhankoral b4761650b9 Calculate rotation of family instance 2023-12-08 02:15:56 +03:00
oguzhankoral 7921ab1f36 Add direct shape option to components back 2023-12-07 21:22:04 +03:00
oguzhankoral 3f793dc9db Exclude definitions from conversion escape
- Previously we were using definition mappings only for direct shape conversions but now they can live in instances
2023-12-07 21:19:02 +03:00
oguzhankoral 7b3f2e47bb Pass group selection info if only group selected 2023-12-07 16:09:12 +03:00
oguzhankoral 1a4e3b5a44 Implement family instance mapping 2023-12-07 16:03:02 +03:00
oguzhankoral ed0e1bf249 Set hard coded categories just once and source families when source set/updated 2023-12-07 16:02:37 +03:00
oguzhankoral 5e9566c1d6 Adjust available mapping methods according to selection 2023-12-07 16:01:51 +03:00
oguzhankoral 24ec910735 Filter family types for 'Family Instance' 2023-12-07 16:01:13 +03:00
oguzhankoral e4c53f536d Implement New Revit Family option 2023-12-05 23:05:38 +03:00
9 changed files with 107 additions and 216 deletions
@@ -1,27 +0,0 @@
# frozen_string_literal: true
require_relative 'command'
require_relative '../states/initial_state'
require_relative '../ui/vue_view'
require_relative '../actions/initialize_speckle'
require_relative '../observers/factory'
module SpeckleConnector
module Commands
# Command to reset Speckle UI window location onto center of SketchUp window.
class ResetWindowLocation < Command
private
def _run
app = self.app
vue_view = app.ui_controller.user_interfaces[Ui::SPECKLE_UI_ID]
if vue_view
vue_view.dialog.reset_dialog_location
else
puts "Speckle UI didn't initialized!"
end
end
end
end
end
@@ -3,7 +3,6 @@
require_relative 'menu_command_handler'
require_relative 'action_command'
require_relative 'initialize_speckle'
require_relative 'reset_window_location'
require_relative '../actions/one_click_send'
module SpeckleConnector
@@ -11,7 +10,6 @@ module SpeckleConnector
# Speckle menu commands that adds them to Sketchup menu and toolbar.
class SpeckleMenuCommands
CMD_INITIALIZE_SPECKLE = :initialize_speckle
CMD_RESET_WINDOW_LOCATION_SPECKLE = :reset_window_location_speckle
CMD_SEND_TO_SPECKLE = :send_to_speckle
CMD_RECEIVE_FROM_SPECKLE = :receive_from_speckle
@@ -28,9 +26,6 @@ module SpeckleConnector
commands.add_to_menu!(CMD_INITIALIZE_SPECKLE, speckle_menu)
commands.add_to_toolbar!(CMD_INITIALIZE_SPECKLE, speckle_toolbar)
commands[CMD_RESET_WINDOW_LOCATION_SPECKLE] = reset_window_location_command(app)
commands.add_to_menu!(CMD_RESET_WINDOW_LOCATION_SPECKLE, speckle_menu)
# commands[CMD_SEND_TO_SPECKLE] = send_command(app)
# commands.add_to_menu!(CMD_SEND_TO_SPECKLE, speckle_menu)
# commands.add_to_toolbar!(CMD_SEND_TO_SPECKLE, speckle_toolbar)
@@ -47,17 +42,6 @@ module SpeckleConnector
cmd
end
def self.reset_window_location_command(app)
cmd = MenuCommandHandler.sketchup_command(
ResetWindowLocation.new(app), 'Reset Window Location'
)
cmd.tooltip = 'Bring Speckle window onto center of SketchUp window'
cmd.status_bar_text = 'Bring Speckle window onto center of SketchUp window'
cmd.small_icon = '../../img/s2logo.png'
cmd.large_icon = '../../img/s2logo.png'
cmd
end
def self.send_command(app)
cmd = MenuCommandHandler.sketchup_command(
ActionCommand.new(app, Actions::OneClickSend), 'Send to Speckle'
-4
View File
@@ -57,10 +57,6 @@ module SpeckleConnector
html_dialog.execute_script(data)
end
def reset_dialog_location
html_dialog.center
end
private
# @return [UI::HtmlDialog] the Sketchup interface to dialog
+8 -30
View File
@@ -48,25 +48,21 @@
<v-img v-if="user.avatar" :src="user.avatar" />
<v-img v-else :src="`https://robohash.org/` + user.id + `.png?size=40x40`" />
</v-avatar>
<div>
<b>{{ user.name }}</b>
</div>
<div class="caption">
{{ user.company }}
<br />
{{ user.bio ? 'Bio: ' + user.bio : '' }}
</div>
<div>
<b>{{ user.name }}</b>
<br />
<b>{{ user.email }}</b>
</div>
<div class="caption">
<b>{{ serverInfo.canonicalUrl }}</b>
</div>
</v-card-text>
<v-card-text v-if="accounts()">
<v-divider class="my-3" />
<div v-for="account in accounts()" :key="account.id">
<v-btn
v-if="account.id != activeAccount().id"
v-if="account.userInfo.id != user.id"
rounded
large
class="my-1 elevation-0"
@@ -105,12 +101,12 @@
</v-container>
<create-stream-dialog
v-if="accounts().length !== 0"
:is-f-e2-terms="preferences && preferences.user && preferences.user.fe2"
:is-f-e2="preferences && preferences.user && preferences.user.fe2"
:account-id="activeAccount().userInfo.id"
:server-url="activeAccount().serverInfo.url"
/>
<v-container v-if="accounts().length !== 0" fluid>
<router-view :stream-search-query="streamSearchQuery"/>
<router-view :stream-search-query="streamSearchQuery" />
</v-container>
<v-container v-else>
<login/>
@@ -132,7 +128,6 @@
/*global sketchup*/
import { bus } from './main'
import userQuery from './graphql/user.gql'
import serverInfoQuery from './graphql/serverInfo.gql'
import { onLogin } from './vue-apollo'
import Login from "@/views/Login";
@@ -152,12 +147,7 @@ global.loadAccounts = function (accounts) {
let uuid = localStorage.getItem('uuid')
if (accounts.length !== 0){
if (uuid) {
var account = accounts.find((acct) => acct['userInfo']['id'] === uuid)
if (account){
global.setSelectedAccount(account)
}else{
global.setSelectedAccount(accounts.find((acct) => acct['isDefault']))
}
global.setSelectedAccount(accounts.find((acct) => acct['userInfo']['id'] === uuid))
} else {
global.setSelectedAccount(accounts.find((acct) => acct['isDefault']))
}
@@ -169,7 +159,6 @@ global.setSelectedAccount = function (account) {
localStorage.setItem('serverUrl', account['serverInfo']['url'])
localStorage.setItem('SpeckleSketchup.AuthToken', account['token'])
localStorage.setItem('uuid', account['userInfo']['id'])
localStorage.setItem('frontend2', account['serverInfo']['frontend2'])
bus.$emit('selected-account-reloaded')
}
@@ -210,9 +199,6 @@ export default {
apollo: {
user: {
query: userQuery
},
serverInfo: {
query: serverInfoQuery
}
},
mounted() {
@@ -255,14 +241,6 @@ export default {
switchAccount(account) {
this.$mixpanel.track('Connector Action', { name: 'Account Select' })
global.setSelectedAccount(account)
// Force pushes to reload page to create ApolloClient from scratch
// setTimeout(() => {
// // timeout to wait a bit for potential sketchup.exec in the mean time calls
// location.reload()
// }, 200);
this.$apollo.queries.user.refetch()
this.$apollo.queries.serverInfo.refetch()
},
requestRefresh() {
sketchup.exec({name: 'reload_accounts', data: {}})
+88 -97
View File
@@ -1,6 +1,10 @@
<template>
<v-card v-if="stream" :class="`mb-3 rounded-lg grey ${$vuetify.theme.dark ? 'darken-4' : 'lighten-4'}`"
@mouseenter="hover = true" @mouseleave="hover = false">
<v-card
v-if="stream"
:class="`mb-3 rounded-lg grey ${$vuetify.theme.dark ? 'darken-4' : 'lighten-4'}`"
@mouseenter="hover = true"
@mouseleave="hover = false"
>
<v-toolbar flat height="70" :color="getColor(invalid)">
<v-btn v-tooptip="''" icon small outlined class="delta-btn" v-if="invalid" @click="activateDiffing">
<v-icon v-if="!diffing" class="toggleUpDown" :class='{ "rotate": diffing }' small>mdi-eye-off-outline</v-icon>
@@ -8,8 +12,12 @@
</v-btn>
<v-toolbar-title class="ml-0" style="position: relative; left: -10px">
<!-- Uncomment when pinning is in place and add style="position: relative; left: -10px" to the element above :) -->
<v-btn v-tooltip="`Pin this ${streamText.toLowerCase()} - it will be saved to this file.`" icon x-small
@click="toggleSavedStream">
<v-btn
v-tooltip="`Pin this ${streamText.toLowerCase()} - it will be saved to this file.`"
icon
x-small
@click="toggleSavedStream"
>
<v-icon v-if="saved" x-small>mdi-pin</v-icon>
<v-icon v-else x-small>mdi-pin-outline</v-icon>
</v-btn>
@@ -21,12 +29,24 @@
<v-btn v-tooltip="'View online'" icon small class="mr-3" @click="openInWeb">
<v-icon small>mdi-open-in-new</v-icon>
</v-btn>
<v-btn v-tooltip="'Send'" icon class="mr-3 elevation-2" :loading="loadingSend" @click="send">
<v-btn
v-tooltip="'Send'"
icon
class="mr-3 elevation-2"
:loading="loadingSend"
@click="send"
>
<!-- <v-icon>mdi-upload</v-icon> -->
<v-img v-if="$vuetify.theme.dark" src="@/assets/SenderWhite.png" max-width="30" />
<v-img v-else src="@/assets/Sender.png" max-width="30" />
</v-btn>
<v-btn v-tooltip="'Receive'" icon class="elevation-2" :loading="loadingReceive" @click="receive">
<v-btn
v-tooltip="'Receive'"
icon
class="elevation-2"
:loading="loadingReceive"
@click="receive"
>
<!-- <v-icon>mdi-download</v-icon> -->
<v-img v-if="$vuetify.theme.dark" src="@/assets/ReceiverWhite.png" max-width="30" />
<v-img v-else src="@/assets/Receiver.png" max-width="30" />
@@ -46,8 +66,11 @@
<template #activator="{ on, attrs }">
<v-slide-x-transition>
<div v-show="hover">
<create-branch-dialog :is-f-e2="preferences && preferences.user && preferences.user.fe2"
:stream-name="stream.name" :stream-id="streamId" />
<create-branch-dialog
:is-f-e2="preferences && preferences.user && preferences.user.fe2"
:stream-name="stream.name"
:stream-id="streamId"
/>
</div>
</v-slide-x-transition>
<v-chip v-if="stream.branches" small v-bind="attrs" class="mr-1" v-on="on">
@@ -57,30 +80,42 @@
</template>
<!-- Branch list -->
<v-list dense>
<v-list-item v-for="(branch, index) in stream.branches.items" :key="index" link
@click="switchBranch(branch.name)">
<v-list-item
v-for="(branch, index) in stream.branches.items"
:key="index"
link
@click="switchBranch(branch.name)"
>
<v-list-item-title class="text-caption font-weight-regular">
<v-icon v-if="branch.name === branchName" small class="mr-1 float-left">
mdi-check
</v-icon>
<v-icon v-else small class="mr-1 float-left">mdi-source-branch</v-icon>
{{ branch.name }} ({{ branch && branch.commits ? branch.commits.totalCount : 0 }})
{{ branch.name }} ({{ branch.commits.totalCount }})
</v-list-item-title>
</v-list-item>
</v-list>
</v-menu>
<v-menu offset-y>
<template #activator="{ on, attrs }">
<v-chip v-if="stream && stream.commits" small v-bind="attrs" v-on="on">
<v-chip v-if="stream.commits" small v-bind="attrs" v-on="on">
<v-icon small class="mr-1 float-left">mdi-source-commit</v-icon>
{{ selectedBranch.commits.items.length ? commitId : 'no commits' }}
</v-chip>
</template>
<v-list v-if="selectedBranch && selectedBranch.commits" dense>
<v-list-item v-for="(commit, index) in selectedBranch.commits.items" :key="index" link
@click="switchCommit(commit.id)">
<v-list dense>
<v-list-item
v-for="(commit, index) in selectedBranch.commits.items"
:key="index"
link
@click="switchCommit(commit.id)"
>
<v-list-item-title class="text-caption font-weight-regular">
<v-icon v-if="(commitId == 'latest' && index == 0) || commit.id == commitId" small class="mr-1 float-left">
<v-icon
v-if="(commitId == 'latest' && index == 0) || commit.id == commitId"
small
class="mr-1 float-left"
>
mdi-check
</v-icon>
<v-icon v-else small class="mr-1 float-left">mdi-source-commit</v-icon>
@@ -96,14 +131,24 @@
<div class="flex-grow-1 px-4">
<v-slide-y-transition>
<div v-show="hover">
<v-text-field v-model="commitMessage" xxxclass="small-text-field" hide-details dense flat
:placeholder="`Write your ${commitText.toLowerCase()} message here`" />
<v-text-field
v-model="commitMessage"
xxxclass="small-text-field"
hide-details
dense
flat
:placeholder="`Write your ${commitText.toLowerCase()} message here`"
/>
</div>
</v-slide-y-transition>
</div>
</v-card-text>
<v-progress-linear v-if="(loadingSend || loadingReceive) && loadingStage" key="progress-bar" height="14"
indeterminate>
<v-progress-linear
v-if="(loadingSend || loadingReceive) && loadingStage"
key="progress-bar"
height="14"
indeterminate
>
<div class="text-caption">
{{ loadingStage }}
</div>
@@ -119,9 +164,8 @@
import gql from 'graphql-tag'
import { bus } from '../main'
import streamQuery from '../graphql/stream.gql'
import projectQuery from '../graphql/project.gql'
import ObjectLoader from '@speckle/objectloader'
import { HostApplications } from '@/utils/hostApplications'
import {HostApplications} from '@/utils/hostApplications'
global.convertedFromSketchup = function (streamId, batches, commitId, totalChildrenCount) {
bus.$emit(`sketchup-objects-${streamId}`, batches, commitId, totalChildrenCount)
@@ -168,8 +212,7 @@ export default {
streamText: '',
branchText: '',
commitText: '',
preferences: {},
filterBranchIds: []
preferences: {}
}
},
apollo: {
@@ -182,18 +225,6 @@ export default {
}
}
},
project: {
prefetch: true,
query: projectQuery,
variables() {
return {
projectId: this.streamId,
filter: {
ids: this.filterBranchIds
}
}
}
},
$subscribe: {
commitCreated: {
query: gql`
@@ -271,39 +302,7 @@ export default {
this.commitText = pref.user.fe2 ? 'Version' : 'Commit'
})
// Collect preferences to render UI according to it
sketchup.exec({ name: "collect_preferences", data: {} })
bus.$on(`set-stream-branch-commit-${this.streamId}`, async (branchId, commitId) => {
console.log(branchId, "branchId");
let res = await this.$apollo.query({
query: gql`
query Project($projectId: String!, $filter: ProjectModelsFilter) {
project(id: $projectId) {
id
name
models (filter: $filter) {
items {
id
name
versions {
items {
id
}
}
}
}
}
}
`,
variables: {
projectId: this.streamId,
filter: {
ids: [branchId]
}
}
})
console.log(res.data);
})
sketchup.exec({name: "collect_preferences", data: {}})
bus.$on(`deactivate-diffing-${this.streamId}`, () => {
this.diffing = false
@@ -348,11 +347,11 @@ export default {
this.$mixpanel.track('Send', { method: 'OneClick' })
})
if (this.saved) sketchup.exec({ name: "notify_connected", data: { stream_id: this.streamId } })
if (this.saved) sketchup.exec({name: "notify_connected", data: {stream_id: this.streamId}})
},
methods: {
getColor(invalid) {
if (invalid) {
getColor(invalid){
if(invalid){
return "#ffdfdf"
} else {
return ""
@@ -362,9 +361,7 @@ export default {
return new Promise((resolve) => setTimeout(resolve, ms))
},
openInWeb() {
var url = localStorage.getItem('frontend2') === "true" ? `${localStorage.getItem('serverUrl')}/projects/${this.streamId}` : `${localStorage.getItem('serverUrl')}/streams/${this.streamId}`
window.open(url)
window.open(`${localStorage.getItem('serverUrl')}/streams/${this.streamId}`)
this.$mixpanel.track('Connector Action', { name: 'Open In Web' })
},
switchBranch(branchName) {
@@ -376,22 +373,22 @@ export default {
this.$mixpanel.track('Connector Action', { name: 'Commit Switch' })
this.commitId = commitId
},
activateDiffing() {
if (this.diffing) {
activateDiffing(){
if (this.diffing){
this.diffing = false
sketchup.exec({ name: "deactivate_diffing", data: {} })
sketchup.exec({name: "deactivate_diffing", data: {}})
return
}
this.diffing = true
bus.$emit("deactivate-diffing-except", (this.streamId))
sketchup.exec({ name: "activate_diffing", data: { stream_id: this.streamId } })
sketchup.exec({name: "activate_diffing", data: {stream_id: this.streamId}})
},
toggleSavedStream() {
if (this.saved) {
sketchup.exec({ name: "remove_stream", data: { stream_id: this.streamId } })
sketchup.exec({name: "remove_stream", data: {stream_id: this.streamId}})
this.$mixpanel.track('Connector Action', { name: 'Stream Remove' })
} else {
sketchup.exec({ name: "save_stream", data: { stream_id: this.streamId } })
sketchup.exec({name: "save_stream", data: {stream_id: this.streamId}})
this.$mixpanel.track('Connector Action', { name: 'Stream Save' })
}
},
@@ -402,7 +399,7 @@ export default {
const isMultiplayer = this.selectedCommit.authorId !== selectedAccount['userInfo']['id']
const sourceApp = this.selectedCommit.sourceApplication
const sourceAppSlug = HostApplications.GetHostAppFromString(sourceApp).slug
this.$mixpanel.track('Receive', { isMultiplayer: isMultiplayer, sourceHostApp: sourceAppSlug, sourceHostAppVersion: sourceApp })
this.$mixpanel.track('Receive', { isMultiplayer: isMultiplayer, sourceHostApp: sourceAppSlug, sourceHostAppVersion: sourceApp})
const refId = this.selectedCommit?.referencedObject
if (!refId) {
this.loadingReceive = false
@@ -419,16 +416,14 @@ export default {
let rootObj = await loader.getAndConstructObject(this.updateLoadingStage)
sketchup.exec({
name: "receive_objects", data: {
sketchup.exec({name:"receive_objects" , data: {
base: rootObj,
stream_name: this.stream.name,
stream_id: this.streamId,
branch_name: this.selectedCommit.branchName,
branch_id: this.selectedCommit.id,
source_app: this.selectedCommit.sourceApplication
}
})
}})
await this.$apollo.mutate({
mutation: gql`
@@ -454,7 +449,7 @@ export default {
this.loadingStage = 'converting'
this.loadingSend = true
this.$mixpanel.track('Send')
sketchup.exec({ name: "send_selection", data: { stream_id: this.streamId } })
sketchup.exec({name:"send_selection" , data: {stream_id: this.streamId}})
console.log('>>> SpeckleSketchUp: Objects requested from SketchUp')
await this.sleep(2000)
},
@@ -484,7 +479,7 @@ export default {
}
const t1 = Date.now()
const elapsedTime = (t1 - t0) / 1000
const elapsedTime = (t1-t0) / 1000
console.log(`Upload time: ${elapsedTime} second`)
let commit = {
@@ -506,12 +501,13 @@ export default {
}
})
console.log('>>> SpeckleSketchUp: Sent to stream: ' + this.streamId, commit)
const url = localStorage.getItem('frontend2') === 'true' ? `${localStorage.getItem('serverUrl')}/projects/${this.streamId}/models/${this.selectedBranch.id}@${res.data.commitCreate}` : `${localStorage.getItem('serverUrl')}/streams/${this.streamId}/commits/${res.data.commitCreate}`
this.$eventHub.$emit('notification', {
text: 'Model selection sent!\n',
action: {
name: 'View in Web',
url: url
url: `${localStorage.getItem('serverUrl')}/streams/${this.streamId}/commits/${
res.data.commitCreate
}`
}
})
this.$apollo.queries.stream.refetch()
@@ -559,7 +555,6 @@ export default {
.fade-leave-active {
transition: opacity 0.2s ease-in;
}
.fade-enter,
.fade-leave-to {
opacity: 0;
@@ -570,31 +565,27 @@ export default {
max-height: 1200px;
overflow: hidden;
}
.expand-leave-active {
transition: all 0.3s ease;
max-height: 1200px;
overflow: hidden;
}
.expand-enter,
.expand-leave-to {
max-height: 0;
opacity: 0;
}
.v-text-field>>>input {
.v-text-field >>> input {
font-size: 0.9em;
}
.v-text-field>>>label {
.v-text-field >>> label {
font-size: 0.9em;
}
.btn-fix:focus::before {
opacity: 0 !important;
}
.btn-fix:hover::before {
opacity: 0.08 !important;
}
@@ -17,13 +17,13 @@
>
mdi-plus-circle
</v-icon>
{{ `Create New ${isFE2Terms ? 'Project': 'Stream'}` }}
{{ `Create New ${isFE2 ? 'Project': 'Stream'}` }}
</v-btn>
</template>
<v-card>
<v-card-title class="text-h5">
{{ `Create a New ${isFE2Terms ? 'Project' : 'Stream'}` }}
{{ `Create a New ${isFE2 ? 'Project' : 'Stream'}` }}
</v-card-title>
<v-container class="px-6" pb-0>
<!--
@@ -56,7 +56,7 @@
hide-details
dense
flat
:placeholder="`${isFE2Terms ? 'Project' : 'Stream'} Name (Optional)`"
:placeholder="`${isFE2 ? 'Project' : 'Stream'} Name (Optional)`"
/>
<v-text-field
v-model="description"
@@ -68,7 +68,7 @@
/>
<v-switch
v-model="privateStream"
:label="`Private ${isFE2Terms ? 'Project' : 'Stream'}`"
:label="`Private ${isFE2 ? 'Project' : 'Stream'}`"
></v-switch>
</v-container>
@@ -171,7 +171,7 @@ export default {
type: String,
default: null
},
isFE2Terms: {
isFE2: {
type: Boolean,
default: false
}
@@ -205,7 +205,7 @@ export default {
},
async getStream(){
try {
const streamWrapper = new StreamWrapper(this.createStreamByIdText, this.accountId, this.serverUrl, localStorage.getItem('frontend2') === 'true')
const streamWrapper = new StreamWrapper(this.createStreamByIdText, this.accountId, this.serverUrl, this.isFE2)
let res = await this.$apollo.query({
query: gql`
query Stream($id: String!){
@@ -250,9 +250,7 @@ export default {
this.$eventHub.$emit('notification', {
text: 'Stream Added by URL!\n',
})
console.log(streamWrapper);
console.log(streamWrapper.branchName.slice(0, -1), "stream-added-by-id-or-url");
await bus.$emit('stream-added-by-id-or-url', stream.id, streamWrapper.branchName.slice(0, -1), streamWrapper.commitId)
bus.$emit('stream-added-by-id-or-url', stream.id)
this.$mixpanel.track('Connector Action', { name: 'Stream Add From URL' })
}
catch (e){
-17
View File
@@ -1,17 +0,0 @@
query Project($projectId: String!, $filter: ProjectModelsFilter) {
project(id: $projectId) {
id
name
models (filter: $filter) {
items {
id
name
versions {
items {
id
}
}
}
}
}
}
-6
View File
@@ -1,6 +0,0 @@
query{
serverInfo {
name
canonicalUrl
}
}
+4 -10
View File
@@ -17,7 +17,7 @@
</div>
<div v-if="allStreamsList" class="mt-5">
<div v-for="stream in allStreamsList" :key="stream.id">
<stream-card :stream-id="stream.id"/>
<stream-card :stream-id="stream.id" />
</div>
<div class="actions text-center">
<v-btn
@@ -59,10 +59,7 @@ export default {
StreamCard: () => import('@/components/StreamCard')
},
props: {
streamSearchQuery: {
type: String,
default: null
}
streamSearchQuery: { type: String, default: null }
},
data() {
return {
@@ -120,19 +117,16 @@ export default {
bus.$on('set-saved-streams', (streamIds) => {
this.savedStreams = streamIds
})
bus.$on('stream-added-by-id-or-url', async(streamId, branchId, commitId) => {
bus.$on('stream-added-by-id-or-url', (streamId) => {
if (!this.savedStreams){
this.savedStreams = []
this.savedStreams.push(streamId)
sketchup.exec({name: "save_stream", data: {stream_id: streamId}})
} else {
if (!this.savedStreams.includes(streamId)){
this.savedStreams.push(streamId)
sketchup.exec({name: "save_stream", data: {stream_id: streamId}})
}
}
await bus.$emit(`set-stream-branch-commit-${streamId}`, branchId, commitId)
sketchup.exec({name: "save_stream", data: {stream_id: streamId}})
})
sketchup.exec({name: "load_saved_streams", data: {}})
console.log('LAUNCHED')